Python異常処理try...Exceptの簡単な使用

18334 ワード

1. try…except
プログラムを書くときにエラーや異常が発生し、プログラムが終了することがあります.try...exceptを使用すると、プログラムが異常で中断されません.エラーが発生する可能性のある文をtryモジュールに入れ、exceptで異常を処理します.Exceptは、特定の例外を処理するか、カッコ内の例外のセットを処理します.except後に例外が指定されていない場合は、デフォルトですべての例外を処理します.各tryには、少なくとも1つのexceptが必要です.
a=10
b=0
try:
    c=a/b
    print (c)
except ZeroDivisionError as e:
    print (e)
print ("done")

実行:
division by zero
done

異常がある場合でもプログラムは実行済みであることがわかる.
2. try …except…else
try...except...else文、異常が発生しない場合、else中の文が実行されます.
a=10
b=0
try:
    c = b/ a
    print (c)
except (IOError ,ZeroDivisionError) as x:
    print (x)
else:
    print ("no error")
print ("done")

実行:
0.0
no error
done

3.raiseによる異常
raiseは、ある条件が成立しているかどうかを確認するために異常を引き起こす.
inputValue=4.2
if type(inputValue)!=type(1):
    raise ValueError
else:
    print (inputValue)

実行:
...
    raise ValueError

ValueError

4. try …finally
例外が発生するかどうかにかかわらず、プログラムが終了する前にfinallyの文が実行されます.
a=10
b=0
try:
    print (a/b)
finally:
    print ("always excute")


実行:
always excute
Traceback (most recent call last):
...
 print (a/b)

ZeroDivisionError: division by zero

finallyが最終的に実行され、異常も通常通り報告されていることがわかります.
5. try …except…finally
a=10
b=0
try:
    print (a/b)
except:
    print("error")
finally:
    print ("always excute")


結果:
error
always excute

6.例外クラスをカスタマイズ
MyExceptionクラスをカスタマイズし、Exceptionを継承します.
class MyException(Exception):
    
    def __init__(self,message):
        Exception.__init__(self)
        self.message=message  

a=9
if a<10:
    try:
        raise MyException("my excepition is raised ")
    except MyException as e:
        print (e.message)

結果:
my excepition is raised 

7.例外をログ・ファイルに保存して、これらの例外を分析します.
import traceback  
try:
    print ('here1:',5/2)
    print ('here2:',10/5)
    print ('here3:',10/0)
    
except Exception as e:
    f=open("log.txt",'a')  
    #traceback.print_exc(file=f)  #         
    traceback.print_exc(file=f)   #      
    f.flush()  
    f.close()


結果:
here1: 2.5
here2: 2.0
log.txtのファイルが生成されます.
8.異常をキャプチャするための小さな方法
方法1:すべての例外をキャプチャする
a=10
b=0
try:
    print (a/b)
except Exception as e:
    print(Exception,":",e)
finally:
    print ("always excute")

実行:
<class 'Exception'> : division by zero
always excute

方法2:tracebackモジュールを用いて異常を表示する
import traceback   
try:
    print ('here1:',5/2)
    print ('here2:',10/5)
    print ('here3:',10/0)
    
except Exception as e:
    traceback.print_exc()

実行:
here1: 2.5
here2: 2.0
Traceback (most recent call last):
  File "/Users/lilong/Desktop/online_release/try_except_use.py", line 59, in <module>
    print ('here3:',10/0)
ZeroDivisionError: division by zero

方法3:sysモジュールを用いて最後の異常を遡及する
import sys   
try:
    print ('here1:',5/2)
    print ('here2:',10/5)
    print ('here3:',10/0)
    
except Exception as e:
    info=sys.exc_info()  
    print (info[0],":",info[1])

実行:
here1: 2.5
here2: 2.0
<class 'ZeroDivisionError'> : division by zero

注意:万能異常Exception検出されたコードブロックから放出される異常には様々な可能性があり、すべての異常タイプに対して1つの処理ロジックだけでよいので、特殊な異常ごとに特殊な処理を行わない限り、Exceptionを使用します.
9.pythonのすべての標準例外クラス:
例外名説明BaseException:すべての例外ベースクラスSystemExit:インタプリタ要求終了KeyboardInterrupt:ユーザー割込み実行(通常は入力^C)Exception:通常のエラーベースクラスStopIteration:反復器に値がないGeneratorExit:ジェネレータ(generator)SystemExit Python:インタプリタ要求StandardError:すべての組み込み標準異常のベースクラスArithmeticError:すべての数値計算エラーのベースクラスFloatingPointError:浮動小数点計算エラーOverflowError:数値演算が最大制限を超えたZeroDivisionError:除算(または型取り)ゼロ(すべてのデータ型)AssertionError:断言文の失敗AttributeError:オブジェクトにこの属性がないEOFError:組み込み入力がありません.EOFタグEnvironmentErrorに到達:オペレーティングシステムエラーのベースクラスIOError:入出力操作失敗OSError:オペレーティングシステムエラーWindowsError:システム呼び出し失敗ImportError:インポートモジュール/オブジェクト失敗KeyboardInterrupt:ユーザ中断実行(通常は入力^C)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:従来のロング・フォームへの自動昇格に関する警告PendingDepresationWarning:プロパティが破棄される警告RuntimeWarning:疑わしいランタイム・ビヘイビアの警告SyntaxWarning:疑わしい構文の警告UserWarning:ユーザー・コード生成の警告
参照先:https://www.cnblogs.com/Lival/p/6203111.html