pythonシステム学習ノート(九)---異常処理
5555 ワード
Pythonの異常処理能力は強力で、ユーザーにエラー情報を正確にフィードバックすることができます.Pythonでは、例外もオブジェクトであり、操作できます.すべての例外はベースクラスExceptionのメンバーです.すべての例外はベースクラスExceptionから継承され、exceptionsモジュールで定義されます.Pythonはすべての例外名を自動的にネーミングスペースに入れるので、プログラムはexceptionsモジュールをインポートする必要がなく、例外を使用することができます.SystemExit異常が発生し、スナップされないと、プログラム実行は終了します.インタラクティブセッションでスナップされていないSystemExit例外が発生すると、セッションは終了します.
try/except:コード内の異常をキャプチャして復元し、except内のエラーにマッチし、自分でexceptで定義したコードを実行した後、プログラムを実行し続けます(異常が発生した後、exceptで異常をキャプチャした後、プログラムを中断せず、try文の後ろのプログラムを実行し続けます)try/finally:異常が発生するかどうかにかかわらず、いずれもクリーンアップ動作を実行します(異常が発生するとプログラムが中断しますが、finally後のコードが実行されます)raise:コードに手動で接触して異常が発生します.assert:プログラムコードで例外を条件付きでトリガーします.with/as実装環境マネージャ.
1:try文:
この例外処理構文のルールは、次のとおりです.はtryの下の文を実行し、異常が発生した場合、実行プロセスは最初のexcept文にジャンプします. 最初のexceptで定義された例外が開始された例外と一致する場合、そのexceptの文が実行されます. 発生した例外が最初のexceptに一致しない場合、2番目のexceptが検索され、作成できるexceptの数に制限はありません. すべてのexceptが一致しない場合、例外は次の呼び出し元の最上位tryコードに渡されます. 異常が発生しない場合、elseブロックコードが実行されます. ユーザー定義の例外は、文字列ではなくクラスのインスタンスに書きます. finallyはexceptとelseの文と同じtry文内に で現れることができる.
1.1 try文とexcept文を使用して例外をキャプチャ
try: block except [exception,[data…]]: block
tryの完全な形式:try/複数のexcept/else文elseは、オプションのtryの最初の行の下のコードブロックがこの文の主な動作を表します.実行してみるプログラムコードです.Exceptセクションはtryコードブロック内で発生する例外プロセッサを定義し、elseセクション(ある場合)は例外が発生していない場合に実行するプロセッサを提供します.
import sys
try:
s=raw_input('test EOFError:')
except EOFError:
print 'meet EOError'
sys.exit()
except:
print 'hello'
1.2 tryとfinallyを使用する:
構文は次のとおりです.
try: block finally: block
文の実行規則は次のとおりです.
・tryでのコードの実行.
・異常が発生した場合、その異常が次のレベルtryに渡されたときにfinallyのコードが実行される.
・異常が発生していない場合はfinallyのコードを実行します.
第2のtry構文は,異常が発生しているかどうかにかかわらずコードを実行する場合に有用である.たとえば、pythonでファイルを開いて読み書き操作を行います.私は操作中に異常が発生するかどうかにかかわらず、最終的にファイルを閉じます.
この2つの形式は互いに衝突しており,1つを使用するともう1つを使用することは許されないが,機能はまた異なる.
try:
f=open('dic.ini','w')
f.write('123')
finally:
print 'close file'
f.close()
1.3統一try/except/finally分句try:main-action:except Exception 1:hander 1 except Exception 2:hander 2...else:else-block finally:finally-blockこの文ではmain-actionコードが先に実行されます.プログラムコード(main-action)が異常を引き起こすと、exceptコードブロックは、放出された異常に一致する文を1つずつテストします.例外がException 1の場合はhander 1コードブロックが実行され、例外がException 2の場合はhander 2コードブロックが実行されます.このように推す.異常が発生しない場合はelse-blockコードブロックが実行されます.前に何が起こってもmain-actionコードブロックが完了すると.finally-blockは実行されます.
2.raise文による手動による例外:カスタム例外
raise [exception[,data]]
Pythonでは、例外を引き起こすには、キーワードraiseを入力し、次に例外を引き起こす名前を入力します.例外名は特定のクラスを識別します:Python例外はそれらのクラスのオブジェクトです.raise文を実行すると、Pythonは指定した例外クラスのオブジェクトを作成します.raise文は、例外オブジェクトを初期化するパラメータを指定することもできます.このため、例外クラスの名前の後にカンマと指定したパラメータ(またはパラメータからなるメタグループ)を追加します.
例:
try:raise MyError#自分で異常except MyErrorを投げ出す:print'a error'
assertは、プログラムコードに条件付きで異常をトリガことができ、条件付きraiseとみなすことができる.assertのほとんどは、内在的なプログラム設計エラーをキャプチャするのではなく、ユーザー定義の制約条件を収集するために使用されます.Pythonはプログラムの設計ミスを自動的に収集するので、通常はassertを書いてインデックス値を超えて、タイプが一致しない、除数が0のようなことをキャプチャする必要があります.発生した異常は、AssertionErrorです.tryに捕まえられなければプログラムは終了します.この文の形式:assert,
3.Exceptionクラスを内蔵
Pythonは内蔵異常を階層化し、各種捕捉モードExceptionをサポートする:異常の最上位ルートスーパークラスStandardError:すべての内蔵エラー異常のスーパークラスArithmeticError:すべての数値エラーのスーパークラスOverflowError:特定の数値エラーを識別するサブクラス
4.sysモジュールを用いて最後の異常を遡及する
import sys try: block except: info=sys.exc_info() print info[0],":",info[1]
または、次のようになります.
import sys tp,val,td = sys.exc_info()
sys.exc_info()の戻り値はtuple、(type,value/message,traceback)です.
ここのtype---異常なタイプ
value/message----異常の情報またはパラメータ
traceback----呼び出しスタック情報を含むオブジェクト.
この点から、この方法はtracebackをカバーしていることがわかる.
練習問題:
異常印刷による行番号と関数名のraise利用
ヒント:
sayHello
try/except:コード内の異常をキャプチャして復元し、except内のエラーにマッチし、自分でexceptで定義したコードを実行した後、プログラムを実行し続けます(異常が発生した後、exceptで異常をキャプチャした後、プログラムを中断せず、try文の後ろのプログラムを実行し続けます)try/finally:異常が発生するかどうかにかかわらず、いずれもクリーンアップ動作を実行します(異常が発生するとプログラムが中断しますが、finally後のコードが実行されます)raise:コードに手動で接触して異常が発生します.assert:プログラムコードで例外を条件付きでトリガーします.with/as実装環境マネージャ.
1:try文:
この例外処理構文のルールは、次のとおりです.
1.1 try文とexcept文を使用して例外をキャプチャ
try: block except [exception,[data…]]: block
tryの完全な形式:try/複数のexcept/else文elseは、オプションのtryの最初の行の下のコードブロックがこの文の主な動作を表します.実行してみるプログラムコードです.Exceptセクションはtryコードブロック内で発生する例外プロセッサを定義し、elseセクション(ある場合)は例外が発生していない場合に実行するプロセッサを提供します.
import sys
try:
s=raw_input('test EOFError:')
except EOFError:
print 'meet EOError'
sys.exit()
except:
print 'hello'
1.2 tryとfinallyを使用する:
構文は次のとおりです.
try: block finally: block
文の実行規則は次のとおりです.
・tryでのコードの実行.
・異常が発生した場合、その異常が次のレベルtryに渡されたときにfinallyのコードが実行される.
・異常が発生していない場合はfinallyのコードを実行します.
第2のtry構文は,異常が発生しているかどうかにかかわらずコードを実行する場合に有用である.たとえば、pythonでファイルを開いて読み書き操作を行います.私は操作中に異常が発生するかどうかにかかわらず、最終的にファイルを閉じます.
この2つの形式は互いに衝突しており,1つを使用するともう1つを使用することは許されないが,機能はまた異なる.
try:
f=open('dic.ini','w')
f.write('123')
finally:
print 'close file'
f.close()
1.3統一try/except/finally分句try:main-action:except Exception 1:hander 1 except Exception 2:hander 2...else:else-block finally:finally-blockこの文ではmain-actionコードが先に実行されます.プログラムコード(main-action)が異常を引き起こすと、exceptコードブロックは、放出された異常に一致する文を1つずつテストします.例外がException 1の場合はhander 1コードブロックが実行され、例外がException 2の場合はhander 2コードブロックが実行されます.このように推す.異常が発生しない場合はelse-blockコードブロックが実行されます.前に何が起こってもmain-actionコードブロックが完了すると.finally-blockは実行されます.
2.raise文による手動による例外:カスタム例外
raise [exception[,data]]
Pythonでは、例外を引き起こすには、キーワードraiseを入力し、次に例外を引き起こす名前を入力します.例外名は特定のクラスを識別します:Python例外はそれらのクラスのオブジェクトです.raise文を実行すると、Pythonは指定した例外クラスのオブジェクトを作成します.raise文は、例外オブジェクトを初期化するパラメータを指定することもできます.このため、例外クラスの名前の後にカンマと指定したパラメータ(またはパラメータからなるメタグループ)を追加します.
例:
try:raise MyError#自分で異常except MyErrorを投げ出す:print'a error'
class ShortInputException(Exception):
'''A user-defined exception class.'''
def __init__ (self, length, atleast):
Exception.__init__(self)
self.length = length
self.atleast = atleast
try :
s = raw_input( 'Enter something --> ')
if len (s) < 3 :
raise ShortInputException(len (s), 3 )
# Other work can continue as usual here
except EOFError:
print '
Why did you do an EOF on me?'
except ShortInputException, x:
print 'ShortInputException: The input was of length %d, \
was expecting at least %d' % (x.length,x.atleast)
else:
print 'No exception was raised.'
assertは、プログラムコードに条件付きで異常をトリガことができ、条件付きraiseとみなすことができる.assertのほとんどは、内在的なプログラム設計エラーをキャプチャするのではなく、ユーザー定義の制約条件を収集するために使用されます.Pythonはプログラムの設計ミスを自動的に収集するので、通常はassertを書いてインデックス値を超えて、タイプが一致しない、除数が0のようなことをキャプチャする必要があります.発生した異常は、AssertionErrorです.tryに捕まえられなければプログラムは終了します.この文の形式:assert
def f(x):
assert x>0,'x must be great zerot'
return x**2
f(-1)
3.Exceptionクラスを内蔵
Pythonは内蔵異常を階層化し、各種捕捉モードExceptionをサポートする:異常の最上位ルートスーパークラスStandardError:すべての内蔵エラー異常のスーパークラスArithmeticError:すべての数値エラーのスーパークラスOverflowError:特定の数値エラーを識別するサブクラス
import exceptions
help(exceptions)
4.sysモジュールを用いて最後の異常を遡及する
import sys try: block except: info=sys.exc_info() print info[0],":",info[1]
または、次のようになります.
import sys tp,val,td = sys.exc_info()
sys.exc_info()の戻り値はtuple、(type,value/message,traceback)です.
ここのtype---異常なタイプ
value/message----異常の情報またはパラメータ
traceback----呼び出しスタック情報を含むオブジェクト.
この点から、この方法はtracebackをカバーしていることがわかる.
練習問題:
異常印刷による行番号と関数名のraise利用
ヒント:
f = sys.exc_info()[2].tb_frame.f_back
f.f_code.co_name, f.f_lineno #
sayHello
import sys
class PrintNameLine(Exception):
def __init__ (self,say):
Exception.__init__(self)
self.sayhello = say
try :
raise PrintNameLine('helloworld')
except PrintNameLine,x:
print '%s'%(x.sayhello )