【十五】pythonの異常処理

11079 ワード

1、何が異常ですか.
例外は、プログラムの実行中に発生し、プログラムの正常な実行に影響を与えるイベントです.一般的に、Pythonがプログラムを正常に処理できない場合に異常が発生します.異常はPythonオブジェクトで、エラーを表します.Pythonスクリプトに異常が発生した場合、処理をキャプチャする必要があります.そうしないと、プログラムは実行を終了します.
1 2 3 4 try :      pass except Exception,ex:      pass
需要:ユーザーが入力した2つの数値を加算
while True:
    num1 = raw_input('num1:')
    num2 = raw_input('num2:')
    try:
        num1 = int(num1)
        num2 = int(num2)
        result = num1 + num2
    except Exception, e:
        print '    ,    :'
        print e

2、異常種類
pythonには異常の種類が非常に多く、各異常は特定の異常を処理するのに特化しています!!!
AttributeError              ,  foo.x,  foo    x
IOError   /    ;          
ImportError         ;             
IndentationError     (   ) ;        
IndexError           ,   x      ,     x[5]
KeyError             
KeyboardInterrupt Ctrl+C   
NameError               
SyntaxError Python    ,      (          ,   )
TypeError              
UnboundLocalError                 ,                 ,
          
ValueError             ,          
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

特殊な処理や注意喚起の例外については、先に定義し、最後にExceptionを定義してプログラムが正常に動作していることを確認します.
1 2 3 4 5 6 7 8 9 s1 = 'hello' try :      int (s1) except KeyError,e:      print ' ' except IndexError,e:      print ' ' except Exception, e:      print ' '
3、異常その他の構造
スナップ例外:
try/except      try       ,   except           。 
                 ,   try    。 
  : 
    try:
                        #      
    except :
                        #   try     'name'  
    except ,:
                        #     'name'  ,       
    else:
                        #         

tryの動作原理
try文を開始すると、pythonは現在のプログラムのコンテキストにタグを付けます.これにより、異常が発生した場合にここに戻ることができます.try句は先に実行され、次に実行時に異常が発生するかどうかに依存します.
1.    try           ,python    try            
except  ,      ,        try  (              
 )。
2.    try          ,      except  ,          
try,         (       ,          )。
3.    try           ,python   else      (   else 
 ),         try  。

      ,          ,       :
    try:
        fh = open("testfile", "w")
        fh.write("        ,      !!")
    except IOError:
        print "Error:              "
    else:
        print "        "
        fh.close()

  :
    # python test.py 
                
    # cat testfile       #        
                ,      !! 

 
      ,            ,         ,     :
    try:
        fh = open("testfile", "w")    
        fh.write("        ,      !!")
    except IOError:
        print "Error:              "
    else:
        print "        "
        fh.close() 

            ,    testfile       
       :
    $ python test.py                                #           
    Error:              

EXceptを使用して例外タイプを持たない
次の例では、exceptを使用する例外タイプを持たずに使用できます.
     try:
             
        ......................
     except:
            ,      
        ......................
     else:
                      

以上のようにtry-except文は、発生したすべての例外をキャプチャします.しかし、これは良い方法ではありません.このプログラムで具体的な異常情報を識別することはできません.すべての例外をキャプチャするためです.
EXceptを使用すると、複数の例外タイプが発生します.
同じexcept文を使用して、複数の例外情報を処理することもできます.
    try:
             
        ................
    except(Exception1[, Exception2[,...ExceptionN]]]):
                   ,      
       ......................
    else:
                    

try-finally文
try-finally文は、例外が発生するかどうかにかかわらず、最後のコードを実行します.
    try:
        
    finally:
            #  try     

例1:
    try:
        fh = open("testfile", "w")
        fh.write("        ,      !!")
    finally:
        print "Error:              "

1 2 3 4 5 6 7 8 9 10 11 12 try :      #      pass except KeyError,e:      # ,      pass else :      # ,      pass finally :      # ,      pass
4.異常のパラメータ:
1つの異常にパラメータを付けることができ、出力の異常情報パラメータとすることができる.except文では、次のように異常なパラメータをキャプチャできます.
     try:
             
        ......................
     except ExceptionType, Argument:
                Argument   ... 

変数が受信する例外値は、通常、例外の文に含まれます.メタグループのフォームでは、変数は1つ以上の値を受信できます.メタグループには、通常、エラー文字列、エラー数値、エラー位置が含まれます.
次の例は、単一の例外の例です.
    #!/usr/bin/python
    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'

5.トリガ異常
raise文を使用して、例外raise構文フォーマットを独自にトリガーできます.
raise [Exception [, args [, traceback]]]
文のExceptionが例外のタイプ(たとえばNameError)パラメータは例外パラメータ値です.このパラメータはオプションで、指定しない場合は例外のパラメータは「None」です.最後のパラメータはオプションです(実際にはあまり使用されません).存在する場合は、例外オブジェクトを追跡します.
例1つの例外は、文字列、クラス、またはオブジェクトであってもよい.Pythonのカーネルが提供する異常の多くはインスタンス化されたクラスであり、これはクラスのインスタンスのパラメータである.例外を定義します.
def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        #      ,           

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

    #!/usr/bin/python
    def mye( level ):
        if level < 1:
            raise Exception("Invalid level!", level)
            #      ,           
    try:
        mye(0)                #     
    except "Invalid level!":
        print 1
    else:
        print 2

    :
    $ python test.py 
    Traceback (most recent call last):
      File "test.py", line 11, in 
        mye(0)
      File "test.py", line 7, in mye
        raise Exception("Invalid level!", level)
    Exception: ('Invalid level!', 0)

6.ユーザー定義例外
1 2 3 4 5 6 7 8 9 10 11 12 class WupeiqiException(Exception):        def __init__( self , msg):          self .message = msg        def __str__( self ):          return self .message   try :      raise WupeiqiException( ' ' ) except WupeiqiException,e:      print e
新しい例外クラスを作成することで、プログラムは独自の例外に名前を付けることができます.例外は、直接的または間接的に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

7.万能異常
pythonの例外には、任意の例外をキャプチャできる万能例外があります.例:
    #cat  aa.py
    s1 = 'hello'
    try:
        int(s1)
    except Exception,e:
        print e

    :  
    #python aa.py 
    invalid literal for int() with base 10: 'hello'

 
8.assert断言
1 2 3 4 5 # assert   assert 1 = = 1   assert 1 = = 2
assert断言を使うのはpythonを学ぶとても良い習慣で、assert断言文のフォーマットと使い方は簡単です.プログラムが完備していない前に、プログラムがどこでエラーになるか分かりません.最もクラッシュを実行させるよりも、エラー条件が発生したときにクラッシュさせるほうがいいです.この場合、assert断言の助けが必要です.
assert断言の役割
assert断言は,そのブール値が真の判定でなければならないことを宣言し,異常が発生すると表現が偽であることを示す.assert断言文はraise-if-notであり、表現式をテストするために使用され、その戻り値が偽であると、異常がトリガーされることが理解できます.assert断言文の構文フォーマットassert expression
いくつかのassertの使用方法の文は参考にします:
assert 1==1
assert 2+2==2*2
assert len(['my boy',12])<10
assert range(4)==[0,1,2,3]

assertブレークスルー文に例外パラメータを追加する方法
assertの異常パラメータは、断言式の後に文字列情報を追加し、断言を説明し、どこが問題なのかをよりよく知ることです.フォーマットは次のとおりです.
assert expression [, arguments]
アサーションの使用方法
Pythonのassertは条件をチェックするために使われています.もしそれが本当なら、何もしません.偽の場合、AssertErrorが放出され、エラーメッセージが含まれます.例:
py> x = 23
py> assert x > 0, "x is not zero or negative"
py> assert x%2 == 0, "x is not an even number"

Traceback (most recent call last):
File "", line 1, in ....
AssertionError: x is not an even number

多くの人がassertをパラメータが間違っているときに異常を投げ出すための迅速で容易な方法として使用しています.しかし、このようにするのは間違っていて、非常に間違っていて、2つの原因があります.まずAssertErrorはパラメータをテストするときに投げ出すべきエラーではありません.このようにコードを書くべきではありません.
if
not isinstance(x, int):
raise AssertionError("not an int")

TypeErrorのエラーを投げ出すべきで、assertはエラーの異常を投げ出すことができます.
しかし、さらに危険なのは、assertに関する悩みです.コンパイルされて実行されず、-Oまたは-ooオプションでPythonを実行すると、assert式が実行されることは保証されません.これは、assertを適切に使用する場合に将来のことですが、assertが不適切に使用されると、コードが-Oで実行されるときにエラーが発生します.
では、いつassertを使うべきですか?特定のルールはありません.