#
9 `raise` 文

  raise_stmt | ::= | "raise" [expression ["," expression ["," expression]]]

  Download entire grammar as text.

式を伴わない場合、`raise` は現在のスコープで最終的に有効に なっている例外を再送出します。そのような例外が現在のスコープで アクティブでない場合、`TypeError` 例外が送出されて、 これがエラーであることを示します (IDLE で実行した場合は、 代わりに exceptionQueue.Empty 例外を送出します)。

それ以外の場合、`raise` は式を値評価して、三つのオブジェクトを 取得します。このとき、`None` を省略された式の値として使います。 最初の二つのオブジェクトは、例外の 型 (type) と 例外の 値 (value) を決定するために用いられます。

最初のオブジェクトがインスタンスである場合、例外の型はインスタンス のクラスになり、インスタンス自体が例外の値になります。このとき 第二のオブジェクトは `None` でなければなりません。

最初のオブジェクトがクラスの場合、例外の型になります。 第二のオブジェクトは、例外の値を決めるために使われます: 第二のオブジェクトがインスタンスならば、そのインスタンスが 例外の値になります。第二のオブジェクトがタプルの場合、 クラスのコンストラクタに対する引数リストとして使われます; `None` なら、空の引数リストとして扱われ、それ以外の型 ならコンストラクタに対する単一の引数として扱われます。 このようにしてコンストラクタを呼び出して生成したインスタンス が例外の値になります。

第三のオブジェクトが存在し、かつ `None` でなければ、 オブジェクトはトレースバック オブジェクト でなければなりません ( 3.2 節参照)。また、 例外が発生した場所は現在の処理位置に置き換えられます。 第三のオブジェクトが存在し、オブジェクトがトレースバック オブジェクトでも `None` でもなければ、`TypeError` 例外が送出されます。`raise` の三連式型は、`except` 節から透過的に例外を再送出するのに便利ですが、再送出すべき 例外が現在のスコープで発生した最も新しいアクティブな例外で ある場合には、式なしの `raise` を使うよう推奨します。

例外に関する追加情報は 4.2 節にあります。また、 例外処理に関する情報は 7.4 節にあります。