Python異常処理知識点まとめ
8335 ワード
pythonは、pythonプログラムの実行中に発生した異常とエラーを処理する2つの非常に重要な機能を提供します.この機能を使用してpythonプログラムをデバッグできます.異常処理:当駅Pythonチュートリアルで詳しく説明します. アサーション(Assertions):当駅Pythonチュートリアルで詳しく説明します.
python標準異常
例外名
説明
BaseException
すべての例外のベースクラス
SystemExit
インタプリタ要求終了
KeyboardInterrupt
ユーザ割り込み実行(通常は入力^C)
Exception
一般的なエラーのベースクラス
StopIteration
反復器にはこれ以上の値はありません
GeneratorExit
ジェネレータに異常が発生し、終了を通知
StandardError
すべての組み込み標準異常のベースクラス
ArithmeticError
すべての数値計算エラーのベースクラス
FloatingPointError
浮動小数点計算エラー
OverflowError
最大限度を超える数値演算
ZeroDivisionError
ゼロを除く(または型を取る)(すべてのデータ型)
AssertionError
アサーション文が失敗しました
AttributeError
オブジェクトにはこの属性がありません
EOFError
組み込み入力なしでEOFタグに到達
EnvironmentError
OSエラーのベースクラス
IOError
入出力操作に失敗しました
OSError
OSエラー
WindowsError
システム呼び出しに失敗しました
ImportError
モジュール/オブジェクトのインポートに失敗しました
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
ユーザーコード生成の警告
異常とは?
例外は、プログラムの実行中に発生し、プログラムの正常な実行に影響を与えるイベントです.
一般的にPythonがプログラムを正常に処理できない場合に異常が発生します.
例外はPythonオブジェクトで、エラーを表します.
Pythonスクリプトに異常が発生した場合、処理をキャプチャする必要があります.そうしないと、プログラムは実行を終了します.
例外処理
スナップ例外はtry/except文を使用できます.
try/except文は、try文ブロック内のエラーを検出し、except文に異常情報をキャプチャして処理させるために使用されます.
異常が発生したときにプログラムを終了したくない場合は、tryでそれをキャプチャするだけです.
構文:
以下は簡単なtry....except...elseの構文:
tryの動作原理は、try文を開始すると、pythonが現在のプログラムのコンテキストにマークされ、異常が発生した場合にここに戻ることができ、try句が先に実行され、次に実行に依存して異常が発生するかどうかを決定することです.
try後の文が実行されたときに異常が発生した場合、pythonはtryに戻り、異常に一致する最初のexcept句を実行します.異常処理が完了すると、制御フローはtry文全体を通過します(異常が処理されたときに新しい異常が発生しない限り).
try後の文に異常が発生したのに一致するexcept句がない場合、異常は上位のtryに渡されるか、プログラムの最上位に渡されます(これによりプログラムが終了し、デフォルトのエラー情報が印刷されます).
try句の実行中に異常が発生しなかった場合、pythonはelse文の後の文(elseがある場合)を実行し、try文全体を制御します.
≪インスタンス|Instance|emdw≫
次の簡単な例では、ファイルを開き、そのファイルの内容が内容に書き込まれ、異常は発生しません.
以上のプログラムの出力結果:
≪インスタンス|Instance|emdw≫
次の簡単な例では、ファイルを開きます.このファイルの内容はコンテンツに書き込まれますが、ファイルには書き込み権限がなく、例外が発生しました.
コードを実行する前に、テストの便利さのためにtestfileファイルの書き込み権限を削除することができます.コマンドは次のとおりです.
上記のコードを再実行します.
$ python test.py Error:ファイルが見つからなかったり、ファイルの読み取りに失敗したり
例外タイプなしでexceptを使用
次の例では、exceptを使用する例外タイプを持たずに使用できます.
try:正常な操作............Except:異常が発生した場合、このコードを実行します.Else:異常がなければこのコードを実行します
以上のようにtry-except文は、発生したすべての例外をキャプチャします.しかし、これは良い方法ではありません.このプログラムで具体的な異常情報を識別することはできません.すべての例外をキャプチャするためです.
EXceptを使用して複数の例外タイプを持つ
同じexcept文を使用して、次のように複数の例外情報を処理することもできます.
try:正常な操作............Exception(Exception 1[,Exception 2[,...ExceptionN]]]):以上の複数の異常のうちの1つが発生し、このコードを実行する.............Else:異常がなければこのコードを実行します
try-finally文
try-finally文は、例外が発生するかどうかにかかわらず、最後のコードを実行します.
≪インスタンス|Instance|emdw≫
開いているファイルに書き込み可能な権限がない場合は、次のように出力されます.
同じ例を以下のように書くこともできます.
tryブロックに異常が投げ出されると、finallyブロックコードが直ちに実行される.
finallyブロック内のすべての文が実行されると、例外が再びトリガーされ、exceptブロックコードが実行されます.
パラメータの内容は例外とは異なります.
異常なパラメータ
1つの異常にパラメータを付けることができ、出力の異常情報パラメータとすることができる.
except文では、次のように異常なパラメータをキャプチャできます.
変数が受信する例外値は、通常、例外の文に含まれます.メタグループのフォームでは、変数は1つ以上の値を受信できます.
メタグループには、通常、エラー文字列、エラー数値、エラー位置が含まれます.
≪インスタンス|Instance|emdw≫
次の例は、単一の例外です.
以上のプログラムの実行結果は以下の通りです.
トリガ異常
raise文を使用して異常をトリガーできます
raise構文のフォーマットは次のとおりです.
文のExceptionは例外のタイプ(たとえばNameError)パラメータ標準例外のいずれかであり、argsは独自に提供された例外パラメータです.
最後のパラメータはオプションです(実際にはあまり使用されません).存在する場合は、例外オブジェクトを追跡します.
≪インスタンス|Instance|emdw≫
例外は、文字列、クラス、またはオブジェクトです.Pythonのカーネルが提供する異常の多くはインスタンス化されたクラスであり、これはクラスのインスタンスのパラメータである.次のように、例外を定義するのは簡単です.
注意:例外をキャプチャするには、「except」文は同じ例外でクラスオブジェクトまたは文字列を放出する必要があります.
たとえば、上記の例外をキャプチャします.「except」文は次のようになります.
≪インスタンス|Instance|emdw≫
以上のコードを実行し、出力結果は次のとおりです.
ユーザーカスタム例外
新しい例外クラスを作成することで、プログラムは独自の例外に名前を付けることができます.例外は、直接的または間接的にExceptionクラスから継承される典型的な方法であるべきです.次に、異常トリガ時により多くの情報を出力するためにRuntimeErrorに関連するクラスを作成した例を示します.
try文ブロックでは、ユーザーがカスタマイズした例外の後にexceptブロック文が実行され、変数eはNetworkerrorクラスを作成するためのインスタンスです.
上記のクラスを定義すると、次のように例外をトリガーできます.
python標準異常
例外名
説明
BaseException
すべての例外のベースクラス
SystemExit
インタプリタ要求終了
KeyboardInterrupt
ユーザ割り込み実行(通常は入力^C)
Exception
一般的なエラーのベースクラス
StopIteration
反復器にはこれ以上の値はありません
GeneratorExit
ジェネレータに異常が発生し、終了を通知
StandardError
すべての組み込み標準異常のベースクラス
ArithmeticError
すべての数値計算エラーのベースクラス
FloatingPointError
浮動小数点計算エラー
OverflowError
最大限度を超える数値演算
ZeroDivisionError
ゼロを除く(または型を取る)(すべてのデータ型)
AssertionError
アサーション文が失敗しました
AttributeError
オブジェクトにはこの属性がありません
EOFError
組み込み入力なしでEOFタグに到達
EnvironmentError
OSエラーのベースクラス
IOError
入出力操作に失敗しました
OSError
OSエラー
WindowsError
システム呼び出しに失敗しました
ImportError
モジュール/オブジェクトのインポートに失敗しました
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
ユーザーコード生成の警告
異常とは?
例外は、プログラムの実行中に発生し、プログラムの正常な実行に影響を与えるイベントです.
一般的にPythonがプログラムを正常に処理できない場合に異常が発生します.
例外はPythonオブジェクトで、エラーを表します.
Pythonスクリプトに異常が発生した場合、処理をキャプチャする必要があります.そうしないと、プログラムは実行を終了します.
例外処理
スナップ例外はtry/except文を使用できます.
try/except文は、try文ブロック内のエラーを検出し、except文に異常情報をキャプチャして処理させるために使用されます.
異常が発生したときにプログラムを終了したくない場合は、tryでそれをキャプチャするだけです.
構文:
以下は簡単なtry....except...elseの構文:
try:
#
except :
# try 'name'
except ,:
# 'name' ,
else:
#
tryの動作原理は、try文を開始すると、pythonが現在のプログラムのコンテキストにマークされ、異常が発生した場合にここに戻ることができ、try句が先に実行され、次に実行に依存して異常が発生するかどうかを決定することです.
try後の文が実行されたときに異常が発生した場合、pythonはtryに戻り、異常に一致する最初のexcept句を実行します.異常処理が完了すると、制御フローはtry文全体を通過します(異常が処理されたときに新しい異常が発生しない限り).
try後の文に異常が発生したのに一致するexcept句がない場合、異常は上位のtryに渡されるか、プログラムの最上位に渡されます(これによりプログラムが終了し、デフォルトのエラー情報が印刷されます).
try句の実行中に異常が発生しなかった場合、pythonはelse文の後の文(elseがある場合)を実行し、try文全体を制御します.
≪インスタンス|Instance|emdw≫
次の簡単な例では、ファイルを開き、そのファイルの内容が内容に書き込まれ、異常は発生しません.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write(" , !!")
except IOError:
print "Error: "
else:
print " "
fh.close()
以上のプログラムの出力結果:
$ python test.py
$ cat testfile #
, !!
≪インスタンス|Instance|emdw≫
次の簡単な例では、ファイルを開きます.このファイルの内容はコンテンツに書き込まれますが、ファイルには書き込み権限がなく、例外が発生しました.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write(" , !!")
except IOError:
print "Error: "
else:
print " "
fh.close()
コードを実行する前に、テストの便利さのためにtestfileファイルの書き込み権限を削除することができます.コマンドは次のとおりです.
chmod -w testfile
上記のコードを再実行します.
$ python test.py Error:ファイルが見つからなかったり、ファイルの読み取りに失敗したり
例外タイプなしでexceptを使用
次の例では、exceptを使用する例外タイプを持たずに使用できます.
try:正常な操作............Except:異常が発生した場合、このコードを実行します.Else:異常がなければこのコードを実行します
以上のようにtry-except文は、発生したすべての例外をキャプチャします.しかし、これは良い方法ではありません.このプログラムで具体的な異常情報を識別することはできません.すべての例外をキャプチャするためです.
EXceptを使用して複数の例外タイプを持つ
同じexcept文を使用して、次のように複数の例外情報を処理することもできます.
try:正常な操作............Exception(Exception 1[,Exception 2[,...ExceptionN]]]):以上の複数の異常のうちの1つが発生し、このコードを実行する.............Else:異常がなければこのコードを実行します
try-finally文
try-finally文は、例外が発生するかどうかにかかわらず、最後のコードを実行します.
try:
finally:
# try
raise
≪インスタンス|Instance|emdw≫
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write(" , !!")
finally:
print "Error: "
開いているファイルに書き込み可能な権限がない場合は、次のように出力されます.
$ python test.py
Error:
同じ例を以下のように書くこともできます.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
try:
fh.write(" , !!")
finally:
print " "
fh.close()
except IOError:
print "Error: "
tryブロックに異常が投げ出されると、finallyブロックコードが直ちに実行される.
finallyブロック内のすべての文が実行されると、例外が再びトリガーされ、exceptブロックコードが実行されます.
パラメータの内容は例外とは異なります.
異常なパラメータ
1つの異常にパラメータを付けることができ、出力の異常情報パラメータとすることができる.
except文では、次のように異常なパラメータをキャプチャできます.
try:
......................
except ExceptionType, Argument:
Argument ...
変数が受信する例外値は、通常、例外の文に含まれます.メタグループのフォームでは、変数は1つ以上の値を受信できます.
メタグループには、通常、エラー文字列、エラー数値、エラー位置が含まれます.
≪インスタンス|Instance|emdw≫
次の例は、単一の例外です.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
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'
トリガ異常
raise文を使用して異常をトリガーできます
raise構文のフォーマットは次のとおりです.
raise [Exception [, args [, traceback]]]
文のExceptionは例外のタイプ(たとえばNameError)パラメータ標準例外のいずれかであり、argsは独自に提供された例外パラメータです.
最後のパラメータはオプションです(実際にはあまり使用されません).存在する場合は、例外オブジェクトを追跡します.
≪インスタンス|Instance|emdw≫
例外は、文字列、クラス、またはオブジェクトです.Pythonのカーネルが提供する異常の多くはインスタンス化されたクラスであり、これはクラスのインスタンスのパラメータである.次のように、例外を定義するのは簡単です.
def functionName( level ):
if level < 1:
raise Exception("Invalid level!", level)
# ,
注意:例外をキャプチャするには、「except」文は同じ例外でクラスオブジェクトまたは文字列を放出する必要があります.
たとえば、上記の例外をキャプチャします.「except」文は次のようになります.
try:
except Exception,err:
else:
≪インスタンス|Instance|emdw≫
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
def mye( level ):
if level < 1:
raise Exception,"Invalid level!"
# ,
try:
mye(0) #
except Exception,err:
print 1,err
else:
print 2
以上のコードを実行し、出力結果は次のとおりです.
$ python test.py
1 Invalid level!
ユーザーカスタム例外
新しい例外クラスを作成することで、プログラムは独自の例外に名前を付けることができます.例外は、直接的または間接的に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