十一、異常

20695 ワード

一、異常解決
例外定義:Pythonでは、プログラムの実行中に発生したエラーを例外と呼びます.リストインデックスの境界を越えたり、存在しないファイルを開いたりします.
二、捕獲異常
2.1単純例外の取得
(1)異常をキャプチャするtry...except...
try:
    print('-----test--1---')
    open('123.txt','r')
    print('-----test--2---')
except IOError:
    pass

(2)複数の例外のキャプチャ
#coding=utf-8
try:
    print('-----test--1---')
    open('123.txt','r') #   123.txt     ,      IOError   
    print('-----test--2---')
    print(num)#   num      ,      NameError   

except (IOError,NameError): 
    #       except                 
    print('     ')

(3)異常捕捉の記述as
#coding=utf-8
try:
    print('-----test--1---')
    open('123.txt','r') #   123.txt     ,      IOError   
    print('-----test--2---')
    print(num)#   num      ,      NameError   

except Exception as result: 
    #       ex
    print(result)

Exception(すべての例外クラスの親)のオブジェクトresultを定義します.例外処理オブジェクトの印刷resultを受信すると、プログラムが例外情報を取得しているため、例外によって終了することはありません.
(4)異常がキャプチャされていなければelse中のことを実行する.
#coding=utf-8
try:
    print('-----test--1---')
    open('123.txt','r') #   123.txt     ,      IOError   
    print('-----test--2---')
    print(num)#   num      ,      NameError   

except Exception as result: 
    #       ex
    print(result)
else:
	print('       ')

(5)終了動作finally
例外が発生するかどうかにかかわらず実行され、リソースの解放によく使用されます.
try:
   while True:
         content = f.readline()
         if len(content) == 0:
             break
         time.sleep(2)
         print(content)
 except:
     #           ,     ,       
   print('     ')
 finally:
     f.close()
     print('    ')

プログラムが終了するまでfinallyは文から実行され、ファイルを閉じます.
  • elseとfinallyはexceptの後に書かなければなりません.finallyは最後に書く必要があります.exceptがない場合、elseはtryと組み合わせて使用できません.そうしないと文法エラーが発生します.

  • 三、異常放出
    3.1 raiseによる異常放出
    (1)クラス名を使用して例外を開始ralse文で例外のクラス名を指定すると、そのクラスのインスタンスオブジェクトが作成され、例外が開始されます.
    raise IndexError
    

    (2)例外クラスのインスタンスを使用して例外を開始する 例外クラスを作成するインスタンスを指定することにより、そのインスタンスオブジェクトを直接使用して例外を開始する.
    index = IndexError()
    raise 
    

    (3)伝達異常
    #coding=utf-8
    try:
        print('-----test--1---')
        open('123.txt','r') #   123.txt     ,      IOError   
        print('-----test--2---')
        print(num)#   num      ,      NameError   
    
    except (IOError,NameError): 
        #       except                 
        print('     ')
        raise
    

    (4)異常の記述情報の指定
    >>> raise IndexError('        ')
    Traceback (most recent call last):
      File "", line 1, in <module>
    IndexError:         
    

    (5)異常誘発異常 異常に別の異常を投げ出す場合はraise-from文を用いて実現する.
    >>> try:
    ...     namber
    ... except Exception as exception:
    ...     raise IndexError('        ') from exception
    ...
    Traceback (most recent call last):
      File "", line 2, in <module>
    NameError: name 'namber' is not defined
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "", line 4, in <module>
    IndexError:         
    

    (6)すべての異常をキャプチャする
    try:
         namber
    except Exception as exception:
         print(exception)
    

    3.2 assertの使用
     assert文は断言とも呼ばれ、指定された条件をユーザが満たすことを望むユーザ定義の制約条件が満たされない場合、AssertError異常をトリガーするので、assert文は条件式のralse文とすることができる.
    assert      ,data    # data  
    

    次のようになります.
    a = 0
    if not a!=0:
    	raise AssertionError(data)
    

    プログラムの例:
    >>> a = 0
    >>> assert a!=0, 'a     0'
    Traceback (most recent call last):
      File "", line 1, in <module>
    AssertionError: a     0
    

    assert文は、Pythonが独自にプログラムの設計エラーを収集し、エラーに遭遇したときに自動的に異常を引き起こすため、内在的なプログラム設計エラーをキャプチャするのではなく、ユーザー定義の制約条件を収集するために使用されます.
    四、カスタム例外
    class ShortInputException(Exception):
        '''       '''
        def __init__(self, length, atleast):
            #super().__init__()
            self.length = length
            self.atleast = atleast
    
    def main():
        try:
            s = input('    --> ')
            if len(s) < 3:
                # raise          
                raise ShortInputException(len(s), 3)
        except ShortInputException as result:#x              
            print('ShortInputException:        %d,       %d'% (result.length, result.atleast))
        else:
            print('      .')
    
    main()
    

    五、事前定義の整理
     前にfinally文を紹介したとき、finally文はファイルを閉じるなどのリソースを解放するために使用されると述べました.finally文で手動でリソースを解放するほか、with文で事前定義されたクリーンアップ操作を使用することもできます.つまり、リソースが使用中に異常が発生したかどうかにかかわらず、ファイルが使用された後に自動的に閉じるなどのリソースを解放する操作を実行します.
    5.1 with文
    with文はリソースにアクセスする場合に適用され、使用中に異常が発生したかどうかにかかわらず必要な「クリーンアップ」操作を実行し、リソースを解放することを保証します.
    with      [as     ]

    上記の文法フォーマットの意味は以下の通りです.
  • コンテキスト式:コンテキストマネージャオブジェクトを返します.as句が指定されている場合、オブジェクトはリソースオブジェクトに割り当てられず、コンテキストマネージャの_enter__()メソッドの戻り値は、リソースオブジェクトに割り当てられます.
  • リソースオブジェクト:単一変数、またはメタグループ
  • オブジェクトの操作with文で包まれたコードブロック.このコードブロックを実行する前に、コンテキストマネージャの__が呼び出されます.enter__()メソッドコードブロックを実行すると、__が実行されます.exit__()メソッド.

  • 5.2コンテキストマネージャ
    コンテキストマネージャに関する概念を説明します.(1)コンテキスト管理プロトコル  含む_enter_ ()と_exit_()メソッド.このプロトコルをサポートするオブジェクトがこの2つのメソッドを実装するには、次のように説明します.
  • __enter __(self):コンテキストマネージャに入ると、with-as文のas説明子で指定された変数に戻り値が格納されるメソッドが呼び出されます.
  • exit(self type,value,tb):コンテキストマネージャからこのメソッドを呼び出します.例外がある場合、type、value、tbはそれぞれ例外のタイプ、値、および追跡情報です.異常がない場合、3つのパラメータはいずれもNoneとします.このメソッドの戻り値はTrueまたはFalseで、開始された異常が処理されたかどうかを示します.Falseを返すと、開始された異常がコンテキストに渡されます.

  • (2)コンテキストマネージャ  コンテキスト管理プロトコルをサポートするオブジェクト.enter__()、exit()メソッド.コンテキストマネージャはwith文を実行するときに確立する実行時コンテキストを定義し、with文ブロックコンテキストの入力と終了操作を実行します.(3)実行時コンテキスト  はコンテキストマネージャによって作成され、コンテキストマネージャの_enter_()、 _exit_()メソッド実装.(4)コンテキスト式  with文のキーワードwith以降の式コンテキスト管理プロトコルをサポートするオブジェクトを返す.コンテキストマネージャを理解すると、with文の実行プロセス全体がよく理解できます.具体的には、次のようになります.
  • まずコンテキスト式を実行し、コンテキストマネージャオブジェクトを生成する.
  • 次にコンテキストマネージャを呼び出す_enter__()メソッドは,as句を用いると,_enter__()メソッドの戻り値はas句のリソースオブジェクトに割り当てられる.
  • その後、with文で包まれたコードブロックが実行される.
  • 実行中に例外が発生したかどうかにかかわらず、コンテキストマネージャの_が実行されます.exit__()この方法は、リソースの解放など、プログラムの「クリーンアップ」を実行する.
  • 実行中に異常が発生しなかった場合、またはbreak continueまたはreturn文がコードブロックで実行された場合、Noneをパラメータとして__を呼び出すexit__()メソッドは、実行中に異常が発生した場合sysを使用する.exc_infoで得られた異常情報はパラメータ呼び出し_exit__()メソッド
  • に異常が発生した場合、_exit__()メソッドが返す結果がFalseであると,再び例外を投げ出し,with以外の文論理で例外を処理させるのが一般的である.Trueを返すと、例外は無視され、例外は処理されません.