Pythonによる異常発生、raise()および異常処理
raise()
raise文を使用して例外を発生します.例外/エラー・オブジェクトには名前が必要で、ErrorまたはExceptionクラスのサブクラスである必要があります.
例外とカスタム例外の放出
Pythonは異常オブジェクト(exception object)で異常を表し、エラーが発生すると異常を起こす.例外オブジェクトが処理またはスナップされていない場合、プログラムはいわゆるトレースバック(エラーメッセージ)で実行を終了します.
raise文
Pythonのraiseキーワードは、基本的にC#とJavaのthrowキーワードと同じで、次のように例外を引き起こすために使用されます.
1
2
3
4
raiseキーワードの後ろには投げ出しが共通の例外タイプ(Exception)であり、一般的に投げ出した例外が詳細であればあるほど、Pythonはexceptionsモジュール内に多くの例外タイプを構築し、dir関数を使用してexceptionsの例外タイプを表示します.以下のようにします.
1
2
3
4
伝達異常
例外をキャプチャしましたが、再起動(例外の転送)したい場合は、パラメータを持たないraise文を使用します.
1
2
3
4
5
6
7
8
9
10
カスタム例外タイプ
Pythonでは、Exceptionクラスから継承(直接または間接)するだけで、独自の特殊なタイプの例外をカスタマイズできます.
1
2
スナップ例外
例外をキャプチャ
C#のtry/catchと同様に、Pythonではtry/exceptキーワードを使用して例外をキャプチャします.次のようにします.
1
2
3
4
複数の例外をスナップ
1つのexcept文では、その後に宣言された例外タイプのみがスナップされます.他のタイプの例外が投げ出される可能性がある場合は、もう1つのexcept文を追加する必要があります.または、次のようなより一般的な例外タイプを指定することもできます.
1
2
3
4
5
6
複数の例外をキャプチャするには、複数のexcept文を宣言する以外に、1つのexcept文の後に複数の例外をメタグループとしてリストすることもできます.
1
2
3
4
例外情報の取得
各異常にはいくつかの異常情報があります.一般的には、これらの異常情報を記録する必要があります.
1
2
3
4
5
finally句
finally句とtry句を組み合わせて使用しますがexcept文とは異なり、finallyはtry句内部に異常が発生しているかどうかにかかわらずfinally句内のコードを実行します.一般的には、finally自身がファイルを閉じるか、Socketで使用することが多い.
raise文を使用して例外を発生します.例外/エラー・オブジェクトには名前が必要で、ErrorまたはExceptionクラスのサブクラスである必要があります.
例外とカスタム例外の放出
Pythonは異常オブジェクト(exception object)で異常を表し、エラーが発生すると異常を起こす.例外オブジェクトが処理またはスナップされていない場合、プログラムはいわゆるトレースバック(エラーメッセージ)で実行を終了します.
raise文
Pythonのraiseキーワードは、基本的にC#とJavaのthrowキーワードと同じで、次のように例外を引き起こすために使用されます.
def ThorwErr():
raise Exception(" ")
# Exception:
ThorwErr()
1
2
3
4
raiseキーワードの後ろには投げ出しが共通の例外タイプ(Exception)であり、一般的に投げ出した例外が詳細であればあるほど、Pythonはexceptionsモジュール内に多くの例外タイプを構築し、dir関数を使用してexceptionsの例外タイプを表示します.以下のようにします.
import exceptions
# ['ArithmeticError', 'AssertionError'.....]
print dir(exceptions)
1
2
3
4
伝達異常
例外をキャプチャしましたが、再起動(例外の転送)したい場合は、パラメータを持たないraise文を使用します.
class MuffledCalculator:
muffled = False
def calc(self,expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print 'Division by zero is illegal'
else:
raise
1
2
3
4
5
6
7
8
9
10
カスタム例外タイプ
Pythonでは、Exceptionクラスから継承(直接または間接)するだけで、独自の特殊なタイプの例外をカスタマイズできます.
class SomeCustomException(Exception):
pass
1
2
スナップ例外
例外をキャプチャ
C#のtry/catchと同様に、Pythonではtry/exceptキーワードを使用して例外をキャプチャします.次のようにします.
try:
print 2/0
except ZeroDivisionError:
print ' 0'
1
2
3
4
複数の例外をスナップ
1つのexcept文では、その後に宣言された例外タイプのみがスナップされます.他のタイプの例外が投げ出される可能性がある場合は、もう1つのexcept文を追加する必要があります.または、次のようなより一般的な例外タイプを指定することもできます.
try:
print 2/'0'
except ZeroDivisionError:
print ' 0'
except Exception:
print ' '
1
2
3
4
5
6
複数の例外をキャプチャするには、複数のexcept文を宣言する以外に、1つのexcept文の後に複数の例外をメタグループとしてリストすることもできます.
try:
print 2/'0'
except (ZeroDivisionError,Exception):
print ' '
1
2
3
4
例外情報の取得
各異常にはいくつかの異常情報があります.一般的には、これらの異常情報を記録する必要があります.
try:
print 2/'0'
except (ZeroDivisionError,Exception) as e:
# unsupported operand type(s) for /: 'int' and 'str'
print e
1
2
3
4
5
finally句
finally句とtry句を組み合わせて使用しますがexcept文とは異なり、finallyはtry句内部に異常が発生しているかどうかにかかわらずfinally句内のコードを実行します.一般的には、finally自身がファイルを閉じるか、Socketで使用することが多い.
try:
print 2/'0'
except (ZeroDivisionError,Exception):
print ' '
finally:
print ' '