Python学習#8異常処理メカニズム

7447 ワード

この章では、pythonでの異常処理メカニズムについて説明します.pythonでの異常処理の書き方を熟知し、raiseで異常を出発した場合、異常スタックテキストを介して異常状況を位置決めし、理解する方法について説明します.
異常
エラーと例外
エラー:ソフトウェアの面から言えば、エラーは文法的または論理的です.構文エラーは、ソフトウェアの構造が間違っていることを示し、解釈器によって解釈できないか、コンパイラによってコンパイルできないことを示します.これらのエラーは、プログラムの実行前に修正する必要があります.論理エラーは、不完全または不正な入力による可能性があります.pythonがエラーを検出すると、解釈器は現在のストリームが続行できないことを示し、異常が発生します.
例外:要約すると、プログラムにエラーが発生し、正常な制御フローで予期せぬ動作が発生したためです.したがって、異常は主に2つの段階に分けられます.
  • で異常条件が発生し、エラーが検出され、異常条件が認識されると、解釈器は異常を引き起こす.pythonでは、プログラマー自身が異常を起こすこともできます.異常はエラーが発生した信号で、現在のストリームが中断されます.
  • の異常に対する処理は第2段階で発生し、異常が発生した後、多くの異なる操作を呼び出すことができ、無視、影響の軽減などであることができる.

  • プログラムの実行時に発生するエラーは、通常、不正な入力や操作の失敗などの外部要因によって発生します.これらの要因はプログラマの直接制御の下ではありません.異常処理は、発生時により信頼できる救済措置をとり、アプリケーションの堅牢性を高めることができます.
    pythonの例外
    これまでの学習では,大小の異なる異常を見たことがあるが,ここではいくつかのよく見られる異常を列挙し,熟知するとプログラムエラー時にエラーが発生した位置に迅速に位置決めできる.
  • NameError:宣言されていない変数
  • にアクセスしようとします.
  • ZeroDivisionError:除数ゼロ
  • SyntaxError:pythonインタプリタ構文エラー.この例外は、pythonコードに不正な構造があり、修正する前にプログラムが実行できないことを示す唯一の実行時に発生しない例外です.
  • IndexError:要求されたインデックスがシーケンスの範囲外です.範囲外の値インデックスシーケンスを使用しようとすると開始します.
  • KeyError:存在しない辞書キーを要求します.
  • IOError:入力/出力エラー.たとえば、存在しないディスクファイルのクラスを開こうとすると、オペレーティングシステムの入出力エラーが発生します.
  • AttributeError:不明なオブジェクト属性にアクセスしようとします.
  • AssertionError:断言異常.
  • より多くのpython標準異常
  • 異常の検出と処理
    例外はtry文で検出でき、try文ブロック内のコードはすべて検出されます.try文の形式は通常2種類あり、2つの文は反発し、1つしか使用できません.
  • try-except:異常監視のコードを定義し、異常を処理するメカニズムを提供する.最も一般的なtry文は、tryブロック、exceptブロック、およびオプションのエラー要因から構成されます.
  • # try:
    #      try_suite        #        
    # except Exception[, reason]:
    #      except_suite     #       
    def safe_float(obj):
        try:
            retval=float(obj)
        except ValueError:
            retval='could not convert non-number to float'
        except TypeError:
            retval='type error'
        return retval
    
    if __name__ == '__main__':
        try:
            f=open('file3','r')
        except IOError,e:	#   IOError
            print 'cannot open file3',e
    
    

    プログラム実行時に、解釈器はtryブロックのコードを実行しようとしますが、コードブロックが完了しても異常が発生しない場合、実行フローはexcept文を無視して実行を続けます.一方、except文で指定された例外が発生した後、エラーの原因を保存し、制御フローはすぐに対応するプロセッサにジャンプします.
    tryの異常点以降の文は、永遠に実行されません.
    try-except文は、1つのtry複数のexcept文をサポートするか、1つのexceptで複数の例外を処理します.
    エラーは避けられません.try-exceptの役割は、エラーフィルタではなく、エラーをプロンプトしたり、エラーを処理したりするメカニズムを提供します.大きなコードをtryに読み込んでpassを使用してエラーを無視しないでください.
    else文:except後に使用し、try範囲で異常が検出されない場合にelse句を実行できます.
    finally文:異常が発生するかどうかにかかわらず、文のコードが実行され、finally文はtry-except文とともに使用することができる.
  • try-finally:もう一つのfinallyを使用する方法はtryと一緒に単独で使用することです.try-finallyは、異常をキャプチャするために使用されるのではなく、異常が発生するかどうかにかかわらず、一貫した動作を維持するために使用されます.try範囲内で例外が発生すると、すぐにfinally文セグメントにジャンプし、finallyのすべてのコードが実行されると、上のレベルに異常が発生し続けます.
  • try…except…else…finally

  • コンテキスト管理
    with文:python 2にはコンテキストプロトコルをサポートするプロトコルがいくつかしかありません
  • file
  • decimal.Context
  • threading.LockType
  • threading.Lock
  • threading.RLock
  • threading.Condition
  • threading.Semaphore
  • threading.BoudedSemaphore
  • with open('file2''r') as f:
    	for eachline in f:
    		dosomething
    

    上記のコードは書面の意味のようにfile 2を開き、ファイルオブジェクトをfに付与します.このコードの開始、中間、終了時に異常が発生しても、クリーンアップコードが実行され、ファイルは自動的に閉じられます.
    トリガ異常
    これまで見られた異常はすべて解釈器によって引き起こされた.pythonはraise文が例外を明確に引き起こすことを提供します.raise文の一般的な書き方は、raise[SomeException[,args[,traceback]]の最初のパラメータが異常をトリガーする名前であり、文字列、クラス、またはインスタンスでなければなりません.2番目のパラメータはオプションで、例外に渡されます.個別のオブジェクトまたはオブジェクトのメタグループです.3番目のパラメータはあまり使われませんが、例外がトリガーされたときに新しく生成された異常正常化のための追跡オブジェクトもあります.
    if __name__ == '__main__':
        x=10
        if x>5:
            raise ValueError("x cannot less than 10")
    
        try:
            raise NameError('Name error')
        except NameError:
            print 'this is except'
    

    断言する
    断言は、raise-if文に相当するブール真の判定に等価である必要があり、式をテストし、戻り値が偽であれば異常を投げ出す.戻り値が偽の場合、他の操作を行わないとAssertionErrorが出発します.
    assert 1==1
    assert 2+2==2*3
    

    AssertionError例外はtry-except文でキャプチャすることもできます.
    次の章ではpythonでのオブジェクト向けプログラミングについて説明します.