7.4 try

try 文は、ひとまとめの文に対して、例外処理かつ/または クリーンアップコードを指定します:

try_stmt ::= try1_stmt | try2_stmt
try1_stmt ::= "try" ":" suite
("except" [expression ["," target]] ":" suite)+
["else" ":" suite]
["finally" ":" suite]
try2_stmt ::= "try" ":" suite
"finally" ":" suite
Download entire grammar as text.

バージョン 2.5 で 変更 された仕様: 以前のバージョンの Python では、 try...except...finally が機能しませんでした。 try...excepttry...finally 中で ネストされなければいけません。

except 節は一つまたはそれ以上の例外ハンドラを指定します。 try 節内で全く例外が起きなければ、どの例外ハンドラも 実行されません。try スイート内で例外が発生すると、 例外ハンドラの検索が開始されます。この検索では、except 節を逐次調べて、発生した例外に合致するまで続けます。 式を伴わない except 節を使う場合、最後に書かなければ なりません; この except 節は全ての例外に合致します。 式を伴う except 節に対しては、式が値評価され、 返されたオブジェクトが例外と ``互換である (compatible)'' 場合にその節が合致します。ある例外に対してオブジェクトが互換で あるのは、 それが例外オブジェクトのクラスかベースクラスの場合、または 例外と互換性のある要素が入ったタプルである場合、または、 (非推奨であるところの) 文字列による例外の場合は、送出された文字列そのものである場合です (注意点として、オブジェクトのアイデンティティが一致しなければいけません。 つまり、同じ文字列オブジェクトなのであって、単なる同じ値を持つ文字列ではありません)。

例外がどの except 節にも合致しなかった場合、現在の コードを囲うさらに外側、そして呼び出しスタックへと検索を続けます。 7.1

except 節のヘッダにある式を値評価するときに例外が発生 すると、元々のハンドラ検索はキャンセルされ、新たな例外に対する 例外ハンドラの検索を現在の except 節の外側のコードや 呼び出しスタックに対して行います (try 文全体が 例外を発行したかのように扱われます)。

合致する except 節が見つかると、その except 節は その except 節で指定されているターゲットに代入されて、 もし存在する場合、加えて except 節スイートが実行されます。 全ての except 節は実行可能なブロックを持っていなければ なりません。このブロックの末尾に到達すると、通常は try 文 全体の直後に実行を継続します。(このことは、同じ例外に対してネスト した二つの例外ハンドラが存在し、内側のハンドラ内の try 節 で例外が発生した場合、外側のハンドラは例外を処理しないことを意味 します。)

except 節のスイートが実行される前に、例外に関する 詳細が sys モジュール内の三つの 変数に代入されます: sys.exc_type は、例外を示すオブジェクト を受け取ります; sys.exc_value は例外のパラメタを受け取ります; sys.exc_traceback は、プログラム上の例外が発生した位置を 識別するトレースバックオブジェクト3.2 節参照) を受け取ります。 これらの詳細はまた、関数 sys.exc_info() を介して 入手することもできます。この関数は タプル (exc_type, exc_value, exc_traceback) を返します。ただしこの関数に対応する変数の使用は、スレッドを使った プログラムで安全に使えないため撤廃されています。 Python 1.5 からは、例外を処理した関数から戻るときに、以前の値 (関数呼び出し前の値) に戻されます。

オプションの else 節は、実行の制御が try 節 の末尾に到達した場合に実行されます。7.2else 節内で起きた例外は、else 節に先行する except 節で処理されることはありません。

finally が存在する場合、これは 'クリーンアップ' ハンドラを 指定しています。exceptelse 節を含む try 節が 実行されます。それらの節のいずれかで例外が発生して処理されない場合、 その例外は一時的に保存されます。finally 節が実行されます。 もし保存された例外が存在する場合、それは finally 節の最後で 再送出されます。 finally 節で別の例外が送出されたり、returnbreak 節が実行された場合、保存されていた 例外は失われます。例外情報は、finally 節の実行中には プログラムで取得することができません。

try...finally 文の try スイート内で returnbreak、または continue 文が 実行された場合、finally 節も `抜け出る途中に (on the way out)' 実行されます。

例外に関するその他の情報は 4.2 節にあります。また、 raise 文の使用による例外の生成に関する情報は、  6.9 節にあります。



脚注

... コードを囲うさらに外側、そして呼び出しスタックへと検索を続けます。7.1
例外は、例外を打ち消す finally 節が無い場合にのみ 呼び出しスタックへ伝わります。
... の末尾に到達した場合に実行されます。7.2
現在、制御が ``末尾に到達する'' のは、例外が発生したり、 returncontinue、または break 文 が実行される場合を除きます。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。