ホームページ > バックエンド開発 > Python チュートリアル > Python での例外処理例の分析

Python での例外処理例の分析

WBOY
リリース: 2023-05-16 14:28:06
転載
1568 人が閲覧しました
    ##1. 例外とは

    #Python では、エラーによって引き起こされる例外は次のとおりです。 ## 2. 例外の種類

    Python のさまざまな例外は、さまざまな種類によって識別できます。例外はエラーを識別します。

    Python での例外処理例の分析1. 一般的な例外クラス

    AttributeError foo.x などのオブジェクトを持たないツリーにアクセスしようとしていますが、foo には属性 x

    がありません

      IOError 入出力例外; 基本的にファイルを開けません
    • #ImportError モジュールまたはパッケージをインポートできません; 基本的にパスの問題または名前が間違っています
    • IndentationError 構文エラー (サブクラス); コードが適切に整列していません
    • ##IndexError 添字インデックスがシーケンス境界を超えています (x が存在するときに x にアクセスしようとしているなど)要素は 3 つだけ [5]

    • KeyError 辞書に存在しないキーにアクセスしようとしました

    • KeyboardInterrupt Ctrl C が押されました

    • NameError はオブジェクトが割り当てられていない変数を使用しています

    • SyntaxError Python コードは不正であるため、コードをコンパイルできません (個人的にはこれだと思います)は構文エラーであり、正しく記述されていません)

    • TypeError 受信したオブジェクト タイプが要件を満たしていません

    • UnboundLocalError ローカル変数にアクセスしようとしていますこれは設定されていません。基本的に、同じ名前のグローバル変数を持つ別の変数があり、それにアクセスしていると思われるためです。

    • ValueError 呼び出し元が予期しない値を渡しています。値が正しい型であっても

    • 2. 例外の例:

      # TypeError:int类型不可迭代
      for i in 3:
          pass
      
      # ValueError
      num=input(">>: ") #输入hello
      int(num)
      
      # NameError
      aaa
      
      # IndexError
      l=['egon','aa']
      l[3]
      
      # KeyError
      dic={'name':'egon'}
      dic['age']
      
      # AttributeError
      class Foo:pass
      Foo.x
      
      # ZeroDivisionError:无法完成计算
      res1=1/0
      res2=1+'str'
      ログイン後にコピー
    • 3. 例外処理
    • 1. 基本的な構文を試してください。 ..Except

      try:
          被检测的代码块
      except 异常类型:
          try中一旦检测到异常,就执行这个位置的逻辑
      ログイン後にコピー
    • Example
    try:
        f = [ 'a', 'a', 'a','a','a', 'a','a',]
        g = (line.strip() for line in f) #元组推导式
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
    except StopIteration:
        f.close()
    ログイン後にコピー

    Exception クラス 指定された例外の処理にのみ使用でき、指定されていない例外は処理できません。

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:  # 未捕获到异常,程序直接报错
        print(e)
    ログイン後にコピー

    2. マルチブランチ例外、例外、およびユニバーサル例外: 例外

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    except Exception as e:
        print(e)
    ログイン後にコピー

    3. try/excel...else

    別の try/excel があります。ステートメント オプションの else 句を使用する場合は、すべての else 句の後に配置する必要があります。

    else 句は、try 句で例外が発生しなかった場合に実行されます。

    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except IOError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
    ログイン後にコピー

    4. 例外の最終実行であるfinally

    try-finallyステートメントでは、例外が発生したかどうかに関係なく、最終的なコードが実行されます。

    クリーンアップ動作の定義:

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    #except Exception as e:
    #    print(e)
    else:
        print('try内代码块没有异常则执行我')
    finally:
        print('无论异常与否,都会执行该模块,通常是进行清理工作')
    ログイン後にコピー

    #基数 10 の int() のリテラルが無効です: 'hello'

    #このモジュールは、通常、例外の有無に関係なく実行されます。クリーンアップ作業を実行します

    4. 例外をスローします raise

    Python は、raise ステートメントを使用して、指定された例外をスローします。

    raise の構文形式は次のとおりです。

    raise [Exception [, args [, traceback]]]
    ログイン後にコピー
    try:
        raise TypeError('抛出异常,类型错误')
    except Exception as e:
        print(e)
    ログイン後にコピー

    raise 唯一のパラメータは、スローされる例外を指定します。これは、例外インスタンスまたは例外クラス (つまり、Exception のサブクラス) である必要があります。

    これが例外をスローしたかどうかを知りたいだけで、それを処理したくない場合は、単純な raise ステートメントで例外を再度スローできます。

    try:
            raise NameError('HiThere')
        except NameError:
            print('An exception flew by!')
            raise
       
    #An exception flew by!
    #Traceback (most recent call last):
    #  File "", line 2, in ?
    #NameError: HiThere
    ログイン後にコピー

    5. カスタム例外

    新しい例外クラスを作成することで、独自の例外を設定できます。例外クラスは、直接または間接的に Exception クラスを継承します。次に例を示します。

    この例では、Exception クラスのデフォルトの __init__() がオーバーライドされます。

    class EgonException(Exception):
        def __init__(self, msg):
            self.msg = msg
    
        def __str__(self):
            return self.msg
    
    
    try:
        raise EgonException('抛出异常,类型错误')
    except EgonException as e:
        print(e) 
    
    #抛出异常,类型错误
    ログイン後にコピー

    基本例外クラス

    多くの異なる例外をスローする可能性のあるモジュールを作成する場合、一般的なアプローチは、このパッケージの基本例外クラスを作成し、この基盤に基づいてクラスが作成することです。さまざまなエラー条件に応じたさまざまなサブクラス:

    ほとんどの例外名は、標準の例外の名前付けと同様に、「Error」で終わります。

    class Error(Exception):
        """Base class for exceptions in this module."""
        pass
     
    class InputError(Error):
        """Exception raised for errors in the input.
     
        Attributes:
            expression -- input expression in which the error occurred
            message -- explanation of the error
        """
     
        def __init__(self, expression, message):
            self.expression = expression
            self.message = message
     
    class TransitionError(Error):
        """Raised when an operation attempts a state transition that's not
        allowed.
     
        Attributes:
            previous -- state at beginning of transition
            next -- attempted new state
            message -- explanation of why the specific transition is not allowed
        """
     
        def __init__(self, previous, next, message):
            self.previous = previous
            self.next = next
            self.message = message
    ログイン後にコピー

    6. Assert

    assert (assert) は、式を判定し、式の条件が false の場合に例外をトリガーするために使用されます。

    アサーションは、プログラムの実行条件が満たされない場合、実行後にプログラムがクラッシュするのを待つことなく、直接エラーを返すことができます。

    構文形式は次のとおりです。

    assert expression
    ログイン後にコピー

    は次と同等です。

    if not expression:
        raise AssertionError
    ログイン後にコピー

    assert の後にパラメータを続けることもできます。

    assert expression [, arguments]
    ログイン後にコピー

    は次と同等です。

    if not expression:
        raise AssertionError(arguments)
    ログイン後にコピー

    次の例では、現在のシステムが Linux かどうかを判断します。条件が満たされない場合は、次のコードを実行せずに例外が直接トリガーされます:

    import sys
    assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
    # 接下来要执行的代码
    
    # Traceback (most recent call last):
    #    File "C:/PycharmProjects/untitled/run.py", line 2, in 
    #      assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
    #  AssertionError: 该代码只能在 Linux 下执行
    ログイン後にコピー

    以上がPython での例外処理例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート