pythonシステム学習ノート(九)---異常処理

5555 ワード

Pythonの異常処理能力は強力で、ユーザーにエラー情報を正確にフィードバックすることができます.Pythonでは、例外もオブジェクトであり、操作できます.すべての例外はベースクラスExceptionのメンバーです.すべての例外はベースクラスExceptionから継承され、exceptionsモジュールで定義されます.Pythonはすべての例外名を自動的にネーミングスペースに入れるので、プログラムはexceptionsモジュールをインポートする必要がなく、例外を使用することができます.SystemExit異常が発生し、スナップされないと、プログラム実行は終了します.インタラクティブセッションでスナップされていないSystemExit例外が発生すると、セッションは終了します.
try/except:コード内の異常をキャプチャして復元し、except内のエラーにマッチし、自分でexceptで定義したコードを実行した後、プログラムを実行し続けます(異常が発生した後、exceptで異常をキャプチャした後、プログラムを中断せず、try文の後ろのプログラムを実行し続けます)try/finally:異常が発生するかどうかにかかわらず、いずれもクリーンアップ動作を実行します(異常が発生するとプログラムが中断しますが、finally後のコードが実行されます)raise:コードに手動で接触して異常が発生します.assert:プログラムコードで例外を条件付きでトリガーします.with/as実装環境マネージャ.
1:try文:
この例外処理構文のルールは、次のとおりです.
  • はtryの下の文を実行し、異常が発生した場合、実行プロセスは最初のexcept文にジャンプします.
  • 最初のexceptで定義された例外が開始された例外と一致する場合、そのexceptの文が実行されます.
  • 発生した例外が最初のexceptに一致しない場合、2番目のexceptが検索され、作成できるexceptの数に制限はありません.
  • すべてのexceptが一致しない場合、例外は次の呼び出し元の最上位tryコードに渡されます.
  • 異常が発生しない場合、elseブロックコードが実行されます.
  • ユーザー定義の例外は、文字列ではなくクラスのインスタンスに書きます.
  • finallyはexceptとelseの文と同じtry文内に
  • で現れることができる.
    1.1 try文とexcept文を使用して例外をキャプチャ
    try:    block except [exception,[data…]]:    block
    tryの完全な形式:try/複数のexcept/else文elseは、オプションのtryの最初の行の下のコードブロックがこの文の主な動作を表します.実行してみるプログラムコードです.Exceptセクションはtryコードブロック内で発生する例外プロセッサを定義し、elseセクション(ある場合)は例外が発生していない場合に実行するプロセッサを提供します. 
    import sys
    try:
        s=raw_input('test EOFError:')
    except EOFError:
        print 'meet EOError'
        sys.exit()
    except:
        print 'hello'
    1.2 tryとfinallyを使用する:
    構文は次のとおりです.
    try:    block finally:    block
    文の実行規則は次のとおりです.
    ・tryでのコードの実行.
    ・異常が発生した場合、その異常が次のレベルtryに渡されたときにfinallyのコードが実行される.
    ・異常が発生していない場合はfinallyのコードを実行します.
    第2のtry構文は,異常が発生しているかどうかにかかわらずコードを実行する場合に有用である.たとえば、pythonでファイルを開いて読み書き操作を行います.私は操作中に異常が発生するかどうかにかかわらず、最終的にファイルを閉じます.
    この2つの形式は互いに衝突しており,1つを使用するともう1つを使用することは許されないが,機能はまた異なる.
    try:
        f=open('dic.ini','w')
        f.write('123')
    finally:
        print 'close file'
        f.close()
    1.3統一try/except/finally分句try:main-action:except Exception 1:hander 1 except Exception 2:hander 2...else:else-block finally:finally-blockこの文ではmain-actionコードが先に実行されます.プログラムコード(main-action)が異常を引き起こすと、exceptコードブロックは、放出された異常に一致する文を1つずつテストします.例外がException 1の場合はhander 1コードブロックが実行され、例外がException 2の場合はhander 2コードブロックが実行されます.このように推す.異常が発生しない場合はelse-blockコードブロックが実行されます.前に何が起こってもmain-actionコードブロックが完了すると.finally-blockは実行されます.
    2.raise文による手動による例外:カスタム例外
    raise [exception[,data]]
    Pythonでは、例外を引き起こすには、キーワードraiseを入力し、次に例外を引き起こす名前を入力します.例外名は特定のクラスを識別します:Python例外はそれらのクラスのオブジェクトです.raise文を実行すると、Pythonは指定した例外クラスのオブジェクトを作成します.raise文は、例外オブジェクトを初期化するパラメータを指定することもできます.このため、例外クラスの名前の後にカンマと指定したパラメータ(またはパラメータからなるメタグループ)を追加します.
    例:
    try:raise MyError#自分で異常except MyErrorを投げ出す:print'a error'
    class  ShortInputException(Exception):
    
        '''A user-defined exception class.'''
    
        def  __init__ (self, length, atleast):
    
            Exception.__init__(self)
    
            self.length = length
    
            self.atleast = atleast
    
    try :
    
        s =  raw_input( 'Enter something --> ')
    
        if len (s) <  3 :
    
            raise ShortInputException(len (s), 3 )
    
        # Other work can continue as usual here
    
    except EOFError:
    
        print '
    Why did you do an EOF on me?' except ShortInputException, x: print 'ShortInputException: The input was of length %d, \ was expecting at least %d' % (x.length,x.atleast) else: print 'No exception was raised.'

    assertは、プログラムコードに条件付きで異常をトリガことができ、条件付きraiseとみなすことができる.assertのほとんどは、内在的なプログラム設計エラーをキャプチャするのではなく、ユーザー定義の制約条件を収集するために使用されます.Pythonはプログラムの設計ミスを自動的に収集するので、通常はassertを書いてインデックス値を超えて、タイプが一致しない、除数が0のようなことをキャプチャする必要があります.発生した異常は、AssertionErrorです.tryに捕まえられなければプログラムは終了します.この文の形式:assert,
    def f(x):
    
        assert x>0,'x must be great zerot'
    
        return x**2
    
    f(-1)
    
    

    3.Exceptionクラスを内蔵
    Pythonは内蔵異常を階層化し、各種捕捉モードExceptionをサポートする:異常の最上位ルートスーパークラスStandardError:すべての内蔵エラー異常のスーパークラスArithmeticError:すべての数値エラーのスーパークラスOverflowError:特定の数値エラーを識別するサブクラス
    import exceptions
    
    help(exceptions)
    
    

    4.sysモジュールを用いて最後の異常を遡及する
    import sys try:    block except:    info=sys.exc_info()    print info[0],":",info[1]
    または、次のようになります.
    import sys     tp,val,td = sys.exc_info()
    sys.exc_info()の戻り値はtuple、(type,value/message,traceback)です.
    ここのtype---異常なタイプ
    value/message----異常の情報またはパラメータ
    traceback----呼び出しスタック情報を含むオブジェクト.
    この点から、この方法はtracebackをカバーしていることがわかる.
    練習問題:
    異常印刷による行番号と関数名のraise利用
    ヒント:
        f = sys.exc_info()[2].tb_frame.f_back
        f.f_code.co_name, f.f_lineno  #      
    
    

    sayHello
    import sys
    class  PrintNameLine(Exception):
    
        def  __init__ (self,say):
    
            Exception.__init__(self)
    
            self.sayhello = say
    
                 
    try :
        raise PrintNameLine('helloworld')
    except PrintNameLine,x:
        print '%s'%(x.sayhello )