try...catch

tryのブロック文と、例外がスローされた際にそれに応じる文を指定します。

文法

try {
  try_statements
}
[catch (exception_var_1) {
  catch_statements_1
}]
...
[catch (exception_var_2) {
  catch_statements_2
}]
[finally {
  finally_statements
}]
// 実際には次のように書かれます。
try {
    throw new Error("oops");
}
catch (e) {
  console.error("error!", e.message);
}
try_statements
実行される処理文です。
catch_statements_1, catch_statements_2
tryブロックで例外がスローされた際に実行される処理文です。
exception_var_1, exception_var_2
catch句に関連付く、例外オブジェクトを保持するための指定子です。
finally_statements
try文が完了した後に実行される処理文です。 この処理文は、例外がスローまたはcatchされた、されないに関係なく実行されます。

説明

try文は少なくとも1つのcatch句、またはfinally句、またはその両方の文を含むtryブロックから構成されます。 下記がtry文の3つの形式になります。

  1. try...catch
  2. try...finally
  3. try...catch...finally

catch句の処理文は、tryブロック内で例外がスローされた際に何を行うかを指定します。 そのため、実行を成功させたい処理文をtryブロックに、 もしその実行が失敗した際に制御を移したい処理文をcatchブロックに書きます。

もし、tryブロック内(または、tryブロック内から呼び出された関数の中)の何らかの処理文が例外をスローすると、 制御は即座にcatch句に移されます。 tryブロック内で例外がスローされなければ、catch句はスキップされます。

finally句はtryブロックとcatch句の実行後、 try文の後に続く処理文の実行前に実行されます。 例外のスロー、またそのcatchが行われたか否かに関係なく、常に実行されます。

try文は1つ以上の入れ子にすることが可能です。 もし、入れ子内のtry文がcatch句を持たない場合、 それを取り囲むtry文のcatch句へ入ります。

また、JavaScriptの例外を扱うためにtry文を使用することも可能です。 JavaScript例外の詳細な情報については、 JavaScript Guideを参照してください。

例外の指定子

tryブロック内で例外がスローされた場合、 exception_var(例えば、catch(e)とすると、このe)は、 throw文によって指定された値を保持しています。 この指定子を使用して、スローされた例外についての情報を取得することが出来ます。

この指定子はcatch句でローカルになります。 すなわち、catch句に入った際にこれが作成され、 catch句の実行が完了した後は使用することが出来なくなります。

finally句

finally句に含まれる処理文は、tryブロックとcatch句が実行された後、 try文の後に続く処理文が実行される前に、実行されます。 finally句は例外がスローされたか否かに関係なく実行されます。 例外がスローされた場合に例外を取り扱うcatch句が存在しなかったとしても、 finally句の処理文は実行されます。

finally句を使用することで例外が発生した際のスクリプトの実行の失敗を、行儀よくさせることが出来ます。 例えば、スクリプトが使用していたリソースを解放をする必要があるかもしれません。 下記の例は、ファイルを開きそのファイルを使用した処理を実行します。 (サーバーサイドのJavaScriptであれば、ファイルへのアクセスが可能です。) もし、ファイルを開いている最中に例外がスローされると、 finally句はスクリプトが失敗する前にファイルを閉じます。

openMyFile()
try {
   // リソースを使用
   writeMyFile(theData);
}
finally {
   closeMyFile(); // 常にリソースが解放される
}

入れ子のtry-block文

まず、どんな事が起こるのかを確認してみましょう。

try {
  try {
    throw new Error("oops");
  }
  finally {
    console.log("finally");
  }
}
catch (ex) {
  console.error("outer", ex.message);
}

// 出力:
// "finally"
// "outer" "oops"

ここでは、常に例外をcatchするcatchブロックを入れ子のtry-blockに追加しています。

try {
  try {
    throw new Error("oops");
  }
  catch (ex) {
    console.error("inner", ex.message);
  }
  finally {
    console.log("finally");
  }
}
catch (ex) {
  console.error("outer", ex.message);
}

// 出力:
// "inner" "oops"
// "finally"

更にここでは、エラーを再スローしてみましょう。

try {
  try {
    throw new Error("oops");
  }
  catch (ex) {
    console.error("inner", ex.message);
    throw ex;
  }
  finally {
    console.log("finally");
  }
}
catch (ex) {
  console.error("outer", ex.message);
}

// 出力:
// "inner" "oops"
// "finally"
// "outer" "oops"

如何なる例外も、1度だけそれを囲う直近のcatchブロックにcatchされ、それ以上再スローされることはありません。 もちろん、その"内部"ブロック内で新しい例外が発生すれば(catchブロック内のコードでthrow可能)、 "外部"のブロックでcatchされます。

仕様

Not part of an ECMA-262 standard: Multiple catch clauses and conditional clauses (SpiderMonkey extension, JavaScript 1.5).

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。