Python異常処理知識点まとめ

8335 ワード

pythonは、pythonプログラムの実行中に発生した異常とエラーを処理する2つの非常に重要な機能を提供します.この機能を使用してpythonプログラムをデバッグできます.
  • 異常処理:当駅Pythonチュートリアルで詳しく説明します.
  • アサーション(Assertions):当駅Pythonチュートリアルで詳しく説明します.

  • python標準異常
    例外名
    説明
    BaseException
    すべての例外のベースクラス
    SystemExit
    インタプリタ要求終了
    KeyboardInterrupt
    ユーザ割り込み実行(通常は入力^C)
    Exception
    一般的なエラーのベースクラス
    StopIteration
    反復器にはこれ以上の値はありません
    GeneratorExit
    ジェネレータに異常が発生し、終了を通知
    StandardError
    すべての組み込み標準異常のベースクラス
    ArithmeticError
    すべての数値計算エラーのベースクラス
    FloatingPointError
    浮動小数点計算エラー
    OverflowError
    最大限度を超える数値演算
    ZeroDivisionError
    ゼロを除く(または型を取る)(すべてのデータ型)
    AssertionError
    アサーション文が失敗しました
    AttributeError
    オブジェクトにはこの属性がありません
    EOFError
    組み込み入力なしでEOFタグに到達
    EnvironmentError
    OSエラーのベースクラス
    IOError
    入出力操作に失敗しました
    OSError
    OSエラー
    WindowsError
    システム呼び出しに失敗しました
    ImportError
    モジュール/オブジェクトのインポートに失敗しました
    LookupError
    無効なデータ・クエリーのベース・クラス
    IndexError
    シーケンスにこのインデックスはありません(index)
    KeyError
    マッピングにこのキーはありません
    MemoryError
    メモリオーバーフローエラー(Pythonインタプリタでは致命的ではありません)
    NameError
    オブジェクトが宣言/初期化されていません(属性なし)
    UnboundLocalError
    初期化されていないローカル変数へのアクセス
    ReferenceError
    弱参照(Weak reference)は、ゴミ回収されたオブジェクトにアクセスしようとします.
    RuntimeError
    一般的なランタイムエラー
    NotImplementedError
    まだ実現されていない方法
    SyntaxError
    Python構文エラー
    IndentationError
    インデントエラー
    TabError
    Tabとスペースの混在
    SystemError
    一般的な解釈システムエラー
    TypeError
    タイプに無効なアクション
    ValueError
    無効なパラメータが入力されました
    UnicodeError
    Unicode関連エラー
    UnicodeDecodeError
    Unicode復号時のエラー
    UnicodeEncodeError
    Unicode符号化時エラー
    UnicodeTranslateError
    Unicode変換時エラー
    Warning
    警告ベースクラス
    DeprecationWarning
    廃棄されたフィーチャーに関する警告
    FutureWarning
    将来的に意味が変わるという警告について
    OverflowWarning
    古いオートリフト長型(long)に関する警告
    PendingDeprecationWarning
    特性が廃棄される警告について
    RuntimeWarning
    不審なランタイム挙動(runtime behavior)の警告
    SyntaxWarning
    不審な文法の警告
    UserWarning
    ユーザーコード生成の警告
    異常とは?
    例外は、プログラムの実行中に発生し、プログラムの正常な実行に影響を与えるイベントです.
    一般的にPythonがプログラムを正常に処理できない場合に異常が発生します.
    例外はPythonオブジェクトで、エラーを表します.
    Pythonスクリプトに異常が発生した場合、処理をキャプチャする必要があります.そうしないと、プログラムは実行を終了します.
    例外処理
    スナップ例外はtry/except文を使用できます.
    try/except文は、try文ブロック内のエラーを検出し、except文に異常情報をキャプチャして処理させるために使用されます.
    異常が発生したときにプログラムを終了したくない場合は、tryでそれをキャプチャするだけです.
    構文:
    以下は簡単なtry....except...elseの構文:
    
    try:
      #      
    except :
      #   try     'name'  
    except ,:
      #     'name'  ,       
    else:
      #        

    tryの動作原理は、try文を開始すると、pythonが現在のプログラムのコンテキストにマークされ、異常が発生した場合にここに戻ることができ、try句が先に実行され、次に実行に依存して異常が発生するかどうかを決定することです.
    try後の文が実行されたときに異常が発生した場合、pythonはtryに戻り、異常に一致する最初のexcept句を実行します.異常処理が完了すると、制御フローはtry文全体を通過します(異常が処理されたときに新しい異常が発生しない限り).
    try後の文に異常が発生したのに一致するexcept句がない場合、異常は上位のtryに渡されるか、プログラムの最上位に渡されます(これによりプログラムが終了し、デフォルトのエラー情報が印刷されます).
    try句の実行中に異常が発生しなかった場合、pythonはelse文の後の文(elseがある場合)を実行し、try文全体を制御します.
    ≪インスタンス|Instance|emdw≫
    次の簡単な例では、ファイルを開き、そのファイルの内容が内容に書き込まれ、異常は発生しません.
    
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    try:
     fh = open("testfile", "w")
     fh.write("        ,      !!")
    except IOError:
     print "Error:              "
    else:
     print "        "
     fh.close()

    以上のプログラムの出力結果:
    
    $ python test.py 
            
    $ cat testfile  #        
            ,      !!

    ≪インスタンス|Instance|emdw≫
    次の簡単な例では、ファイルを開きます.このファイルの内容はコンテンツに書き込まれますが、ファイルには書き込み権限がなく、例外が発生しました.
    
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    try:
     fh = open("testfile", "w")
     fh.write("        ,      !!")
    except IOError:
     print "Error:              "
    else:
     print "        "
     fh.close()

    コードを実行する前に、テストの便利さのためにtestfileファイルの書き込み権限を削除することができます.コマンドは次のとおりです.
    
    chmod -w testfile

    上記のコードを再実行します.
    $ python test.py Error:ファイルが見つからなかったり、ファイルの読み取りに失敗したり
    例外タイプなしでexceptを使用
    次の例では、exceptを使用する例外タイプを持たずに使用できます.
    try:正常な操作............Except:異常が発生した場合、このコードを実行します.Else:異常がなければこのコードを実行します
    以上のようにtry-except文は、発生したすべての例外をキャプチャします.しかし、これは良い方法ではありません.このプログラムで具体的な異常情報を識別することはできません.すべての例外をキャプチャするためです.
    EXceptを使用して複数の例外タイプを持つ
    同じexcept文を使用して、次のように複数の例外情報を処理することもできます.
    try:正常な操作............Exception(Exception 1[,Exception 2[,...ExceptionN]]]):以上の複数の異常のうちの1つが発生し、このコードを実行する.............Else:異常がなければこのコードを実行します
    try-finally文
    try-finally文は、例外が発生するかどうかにかかわらず、最後のコードを実行します.
    
    try:
    
    finally:
     #  try     
    raise

    ≪インスタンス|Instance|emdw≫
    
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    try:
     fh = open("testfile", "w")
     fh.write("        ,      !!")
    finally:
     print "Error:              "

    開いているファイルに書き込み可能な権限がない場合は、次のように出力されます.
    
    $ python test.py 
    Error:              

    同じ例を以下のように書くこともできます.
    
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    try:
     fh = open("testfile", "w")
     try:
      fh.write("        ,      !!")
     finally:
      print "    "
      fh.close()
    except IOError:
     print "Error:              "

    tryブロックに異常が投げ出されると、finallyブロックコードが直ちに実行される.
    finallyブロック内のすべての文が実行されると、例外が再びトリガーされ、exceptブロックコードが実行されます.
    パラメータの内容は例外とは異なります.
    異常なパラメータ
    1つの異常にパラメータを付けることができ、出力の異常情報パラメータとすることができる.
    except文では、次のように異常なパラメータをキャプチャできます.
    
    try:
          
     ......................
    except ExceptionType, Argument:
             Argument   ...

    変数が受信する例外値は、通常、例外の文に含まれます.メタグループのフォームでは、変数は1つ以上の値を受信できます.
    メタグループには、通常、エラー文字列、エラー数値、エラー位置が含まれます.
    ≪インスタンス|Instance|emdw≫
    次の例は、単一の例外です.
    
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    #     
    def temp_convert(var):
     try:
      return int(var)
     except ValueError, Argument:
      print "        
    ", Argument # temp_convert("xyz");

    以上のプログラムの実行結果は以下の通りです.
    
    $ python test.py 
            
    invalid literal for int() with base 10: 'xyz'

    トリガ異常
    raise文を使用して異常をトリガーできます
    raise構文のフォーマットは次のとおりです.
    
    raise [Exception [, args [, traceback]]]

    文のExceptionは例外のタイプ(たとえばNameError)パラメータ標準例外のいずれかであり、argsは独自に提供された例外パラメータです.
    最後のパラメータはオプションです(実際にはあまり使用されません).存在する場合は、例外オブジェクトを追跡します.
    ≪インスタンス|Instance|emdw≫
    例外は、文字列、クラス、またはオブジェクトです.Pythonのカーネルが提供する異常の多くはインスタンス化されたクラスであり、これはクラスのインスタンスのパラメータである.次のように、例外を定義するのは簡単です.
    
    def functionName( level ):
     if level < 1:
      raise Exception("Invalid level!", level)
      #      ,           

    注意:例外をキャプチャするには、「except」文は同じ例外でクラスオブジェクトまたは文字列を放出する必要があります.
    たとえば、上記の例外をキャプチャします.「except」文は次のようになります.
    
    try:
         
    except Exception,err:
             
    else:
         

    ≪インスタンス|Instance|emdw≫
    
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    #     
    def mye( level ):
     if level < 1:
      raise Exception,"Invalid level!"
      #      ,           
    try:
     mye(0)   #     
    except Exception,err:
     print 1,err
    else:
     print 2

    以上のコードを実行し、出力結果は次のとおりです.
    
    $ python test.py 
    1 Invalid level!

    ユーザーカスタム例外
    新しい例外クラスを作成することで、プログラムは独自の例外に名前を付けることができます.例外は、直接的または間接的にExceptionクラスから継承される典型的な方法であるべきです.次に、異常トリガ時により多くの情報を出力するためにRuntimeErrorに関連するクラスを作成した例を示します.
    try文ブロックでは、ユーザーがカスタマイズした例外の後にexceptブロック文が実行され、変数eはNetworkerrorクラスを作成するためのインスタンスです.
    
    class Networkerror(RuntimeError):
     def __init__(self, arg):
      self.args = arg

    上記のクラスを定義すると、次のように例外をトリガーできます.
    
    try:
     raise Networkerror("Bad hostname")
    except Networkerror,e:
     print e.args