Python異常処理try...except、raise

5317 ワード

転入先https://www.cnblogs.com/Lival/p/6203111.html
一、try...Exceptでは、プログラムを書くときにエラーや異常が発生し、プログラムが終了することがあります.たとえば、除算を行う場合、除数が0の場合、ZeroDivisionErrorが発生します.
>>>a=10
>>>b=0
>>>c=a/b
>>>print("done")
Traceback (most recent call last):
  File "", line 3, in 
ZeroDivisionError: division by zero

プログラムはZeroDivisionErrorによって中断され,文print「done」が実行されていないことが分かった.異常を処理するためにtryを使用します.Except、コードの変更:
>>>a = 10
>>>b = 0
>>>try:
>>>  c = a/b
>>>  print(c)
>>>except ZeroDivisionError as e:
>>>  print(e)
>>>  print("done")
    
division by zero
done

これにより、プログラムが異常によって中断されず、print「done」文が正常に実行されます.
エラーが発生する可能性のある文をtryモジュールに置いてexceptで異常を処理します.Exceptは、特定の例外を処理するか、カッコ内の例外のセットを処理します.except後に例外が指定されていない場合は、デフォルトですべての例外を処理します.各tryには、少なくとも1つのexceptが必要です.
例外のセットを処理するには、次のように書くことができます(eは例外のインスタンスを表します):
try:
    pass
except (IOError ,ZeroDivisionError),e:
    print e

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

二、raiseは異常例を引き起こす:入力したデータが整数でない場合、ValueErrorを開始する.
inputValue=int(input("please input a int data :"))
if type(inputValue)!=type(1):
    raise ValueError
else:
    print(inputValue)

1.2と入力し、実行結果は次のようになります.
please input a int data :1.2
Traceback (most recent call last):
File "C:/Users/lirong/PycharmProjects/untitled/openfile.py", line 3, in 
raise ValueError
ValueError

1を入力すると、次のように実行されます.
please input a int data :>? 1
1

三、try...finally異常が発生するかどうかにかかわらず、プログラムが終了する前にfinallyの文が実行されます.
>>>a=10
>>>b=0
>>>try:
>>>    print(a/b)
>>>finally:
>>>    print("always excute")    
Traceback (most recent call last):
  File "", line 4, in 
ZeroDivisionError: division by zero
always excute

異常は発生しますが、プログラムが終了する前にfinallyの文も正常に実行できます.finally文はexcept文と一緒に使用することもできます.
>>>a=10
>>>b=0
>>>try:
>>>    print(a/b)
>>>except:
>>>    print("error")
>>>finally:
>>>    print("always excute")   
error
always excute

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

10未満の数字を入力すると、MyException例外が発生します.
>>>a=int(input("please input a num:"))
>>>if a<10:
>>>    try:
>>>        raise MyException("my excepition is raised ")
>>>    except MyException as e:
>>>        print(e.message)        
please input a num:>? 1
my excepition is raised 

五、pythonのすべての標準異常クラス:
例外名
説明
BaseException
すべての例外のベースクラス
SystemExit
インタプリタ要求終了
KeyboardInterrupt
ユーザ割り込み実行(通常は入力^C)
Exception
一般的なエラーのベースクラス
StopIteration
反復器にはこれ以上の値はありません
GeneratorExit
ジェネレータに異常が発生し、終了を通知
SystemExit
Pythonインタプリタ要求終了
StandardError
すべての組み込み標準異常のベースクラス
ArithmeticError
すべての数値計算エラーのベースクラス
FloatingPointError
浮動小数点計算エラー
OverflowError
最大限度を超える数値演算
ZeroDivisionError
ゼロを除く(または型を取る)(すべてのデータ型)
AssertionError
アサーション文が失敗しました
AttributeError
オブジェクトにはこの属性がありません
EOFError
組み込み入力なしでEOFタグに到達
EnvironmentError
OSエラーのベースクラス
IOError
入出力操作に失敗しました
OSError
OSエラー
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
古いオートリフト長型(long)に関する警告
PendingDeprecationWarning
特性が廃棄される警告について
RuntimeWarning
不審なランタイム挙動(runtime behavior)の警告
SyntaxWarning
不審な文法の警告
UserWarning
ユーザーコード生成の警告