#
7.4 `try` 文

`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`

  Download entire grammar as text.

`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` 節のスイートが実行されｍる前に、例外に関する 詳細が `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.1 `else` 節内で起きた例外は、`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 節にあります。

... の末尾に到達した場合に実行されます。7.1
  現在、制御が ``末尾に到達する'' のは、例外が発生したり、 `return`、`continue`、または `break` 文 が実行される場合を除きます。