Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。
try...catch 文は try ブロックと、catch ブロックか finally ブロックか、その両方から構成されます。まず try ブロック内のコードが実行され、そこで例外が発生すると、catch ブロック内のコードが実行されます。finally ブロック内のコードは、制御する流れが構造全体を抜ける前に、常に実行されます。
実行される文です。
catchStatementstry ブロックの中で例外が発生した場合に実行される文です。
exceptionVar 省略可関連する catch ブロックが捕捉した例外を保持するためのオプションの識別子です。もし catch ブロックが例外の値を利用しない場合は、 exceptionVar とその周りの括弧を省略して catch {...} のようにすることができます。
finallyStatementstry...catch...finally 構造から制御フローが脱出する前に実行される文です。これらの文は、例外が発生されたり捕捉されたりしたかどうかに関係なく実行されます。
try 文は、常に try ブロックから始まります。それから、catch ブロックまたは finally ブロックが存在する必要があります。catch および finally ブロックが両方存在しても構いません。すなわち、try 文には 3 つの形態があります。
if や for などの他の構造とは異なり、try、catch、finally の各ブロックは単一の文ではなく、ブロックでなければなりません。
catch ブロックは、例外が try ブロックの中で発生した場合に何をするかを指定する文を含みます。try ブロック内(または try ブロック内から呼び出された関数の中)のいずれかの文で例外が発生した場合は、制御は即座に catch ブロックへ移ります。try ブロックの中で例外が発生しなかった場合は、catch ブロックは飛ばされます。
finally ブロックは、制御フローが try...catch...finally 構造から脱出する前に常に実行されます。これは常に実行され、例外が発生したかどうか、捕捉されたかどうかには関係ありません。
1 つ以上の try 文を入れ子にする事ができます。内側の try 文が catch ブロックを持っていない場合、それを囲んでいる try 文の catch ブロックに入ります。
try を使用して JavaScript の例外を処理することもできます。 JavaScript の例外に関する情報は JavaScript ガイドを参照してください。
try ブロック内で例外が発生した場合、exceptionVar(つまり catch (e) の e)が例外値を保持します。このバインドを使用して、発生した例外に関する情報を取得できます。このバインドは catch ブロックのスコープ内でのみ利用可能です。
単一の識別子である必要はありません。複数の識別子を一度に代入するには、構造分解パターンが使用できます。
catch 節によって作成されるバインドは catch ブロックと同じスコープに存在するため、catch ブロック内で宣言される変数は catch 節によって作成されるバインドと同じ名前を持つことはできません。(この規則には 1 つの例外があります、ただしこれは非推奨の構文です。)
例外バインドは書き込み可能です。例えば、例外値を正規化して、それが Error オブジェクトであることを保証したい場合があります。
例外値が必要ない場合は、囲む括弧とともに省略できます。
finally ブロックには、try ブロックおよび catch ブロックを実行した後で、try...catch...finally の次の文が実行される前に実行される文が入ります。制御フローは以下のいずれかの場面で、常に finally ブロックに入ります。
なお、finally ブロックは例外が発生するかどうかにかかわらず実行されます。また、例外が発生した場合、finally ブロックは例外を処理する catch ブロックがなくても実行されます。
次の例では finally ブロックの一つの使用例を示します。このコードはファイルを開き、それからファイルを使用する分を実行します。finally ブロックは、例外が発生したとしてもその後で確実にファイルを閉じるよう保証します。
制御フロー文(return, throw, break, continue)を finally ブロック内で使うと、try ブロックや catch ブロックの完了値を「マスク」します。この例では、try ブロックは 1 を返そうとしますが、返す前にまず finally ブロックに制御を委ねるので、代わりに finally ブロックの返値が返されます。
一般に、finally ブロックの中に制御フロー文を置くのは悪い考えです。クリーンアップのためのコードのみを使用してください。
catch ブロックが使われている場合、try ブロックの中から任意の例外が発生すると、catch ブロックが実行されます。例えば、以下のコードで例外が発生すると、制御は catch ブロックへ移動します。
catch ブロックは例外の値を保持する識別子(上記の例では e)を指定します。この値は catch ブロックのスコープ内でのみ利用できます。
「条件付き catch ブロック」は、下記のように try...catch ブロックを if...else if...else 構造と組み合わせることで作成することができます。
よくある使用例としては、次のように想定済みの一部のエラーのみを捕捉(および無視)し、それ以外の場合はエラーを送出し直す場合です。
これは Java などの他の言語の構文を模倣しているのかもしれません。
最初に、次のもので何が起きるか見てみましょう。
ここで、既に内部の try ブロックに catch ブロックを追加しているので、既に例外を捕捉しています。
そして、エラーを送りなおします。
送り直されない限り、例外はどれでも最も内側の catch ブロックで一度だけ捕捉されます。もちろん、何らかの例外が「内側の」のブロックで発生した場合(catch ブロックのコードで例外が発生することを行った場合)、「外側の」ブロックで捕捉されます。
finally ブロックが値を返した場合、 try ブロックや catch ブロックの return 文に関係なく、その値が try-catch-finally 全体の返値になります。 これは catch ブロック内で例外が発生した場合も含まれます。
外側の "oops" は finally ブロックに return があるため送出されません。同じことが、catch ブロックから返されているその他の値にも適用されます。
| ECMAScript® 2027 Language Specification # sec-try-statement |
ブラウザー互換性一覧表を表示するには、JavaScript を有効にしてください。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。