try 文は、ひとまとめの文に対して、例外処理かつ/または クリーンアップコードを指定します:
try_stmt | ::= | try_exc_stmt | try_fin_stmt |
try_exc_stmt | ::= | "try" ":" suite |
("except" [expression
["," target]] ":" suite)+ | ||
["else" ":" suite] | ||
try_fin_stmt | ::= | "try" ":" suite "finally" ":" suite |
try 文には二つの形式: try...except および try...finally があります。 これら二つの形式を混合することはできません (互いにネストすることは できます)。
try...except 形式では、一つまたはそれ以上の 例外ハンドラ (except 節) を指定します。 try 節内で全く例外が起きなければ、どの例外ハンドラも 実行されません。try スイート内で例外が発生すると、 例外ハンドラの検索が開始されます。この検索では、except 節を逐次調べて、発生した例外に合致するまで続けます。 式を伴わない except 節を使う場合、最後に書かなければ なりません; この except 節は全ての例外に合致します。 式を伴う except 節に対しては、式が値評価され、 返されたオブジェクトが例外と ``互換である (compatible)'' 場合にその節が合致します。ある例外に対してオブジェクトが互換で あるのは、オブジェクトがその例外のアイデンティティを持つオブジェクト であるか、(クラスの例外の場合) 例外の基底クラスであるか、 例外と互換性のある要素が入ったタプルである場合です。 同じ値を持つオブジェクトであるだけでなく、アイデンティティが 合致しなければならないので注意してください。
例外がどの except 節にも合致しなかった場合、現在の コードを囲うさらに外側、そして呼び出しスタックへと検索を続けます。
except 節のヘッダにある式を値評価するときに例外が発生 すると、元々のハンドラ検索はキャンセルされ、新たな例外に対する 例外ハンドラの検索を現在の except 節の外側のコードや 呼び出しスタックに対して行います (try 文全体が 例外を発行したかのように扱われます)。
合致する except 節が見つかると、その except 節に ターゲットが指定されている場合、ターゲットに例外のパラメタが代入 され、その後except 節のスイートが実行されます。 except 節は全て実行可能なブロックを持っていなければ なりません。ブロックの末尾に到達すると、通常は try 文 全体の直後に実行を継続します。(このことは、同じ例外に対してネスト した二つの例外ハンドラが存在し、内側のハンドラ内の try 節 で例外が発生した場合、外側のハンドラが例外を処理できないことを意味 します。)
except 節のスイートが実行されmる前に、例外に関する
詳細が 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.1else 節内で起きた例外は、else 節に先行する except 節で処理されることはありません。
try...finally 形式では、`クリーンアップ' ハンドラを 指定します。まず try 節が実行されます。例外が全く発生 しなければ、finally 節が実行されます。例外がtry 節内で発生した場合、例外は一時的に保存され、 finally が実行された後、保存されていた例外が再送出されます。 finally 節で別の例外が送出されたり、return や break 節が実行された場合、保存されていた例外は失われます。 finally 節での continue 文の使用は不正となります (理由は現在の実装上の問題にあります -- この制限は将来解消される かもしれません)。finally 節の実行中は、例外情報を取得 することはできません。
try...finally 文の try スイート内で return、 break、または continue 文が 実行された場合、finally 節も `抜け出る途中に (on the way out)' 実行されます。
例外に関するその他の情報は 4.2 節にあります。また、 raise 文の使用による例外の生成に関する情報は、 6.9 節にあります。