ホームページ  >  記事  >  バックエンド開発  >  Python での例外処理例の分析

Python での例外処理例の分析

WBOY
WBOY転載
2023-05-16 14:28:061477ブラウズ
    ##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 までご連絡ください。