#
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`...`except` は `try`...`finally` 中で ネストされなければいけません。

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

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

`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` 節 の末尾に到達した場合に実行されます。13 `else` 節内で起きた例外は、`else` 節に先行する `except` 節で処理されることはありません。

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

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

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

#### Footnotes

... コードを囲うさらに外側、そして呼び出しスタックへと検索を続けます。12
  例外は、例外を打ち消す `finally` 節が無い場合にのみ 呼び出しスタックへ伝わります。
... の末尾に到達した場合に実行されます。13
  現在、制御が ``末尾に到達する'' のは、例外が発生したり、 `return`、`continue`、または `break` 文 が実行される場合を除きます。