Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

throwは、ユーザー定義の例外を投げます。現在の関数の実行を止めて (throw の後の文は実行しません)、コールスタック内の最初の catch ブロックに制御を移します。呼び出し元の関数に catch ブロックが存在しない場合は、プログラムが終了します。

構文

throw expression; 
expression
投げる式。

説明

例外を投げるためには throw 文を使ってください。例外を投げるときは、expression で例外の値を指定します。次のそれぞれが例外を投げます:

throw "Error2"; // 文字列値である例外を生成します
throw 42;       // 値 42 である例外を生成します
throw true;     // 値 true である例外を生成します

また、throw 文は throw キーワードと式の間に行末を置くことができるため、自動セミコロン挿入 (ASI) の影響を受けます。

例: オブジェクトを投げる

例外を投げるときにオブジェクトを指定することができます。そうすれば、catch ブロックの中でそのオブジェクトのプロパティを参照できます。次の例は、UserException 型のオブジェクトを生成し、それを throw 文の中で使っています。

function UserException(message) {
   this.message = message;
   this.name = "UserException";
}
function getMonthName(mo) {
   mo = mo-1; // 配列の添え字のために月の数を調整する (1=Jan, 12=Dec)
   var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
      "Aug", "Sep", "Oct", "Nov", "Dec"];
   if (months[mo] !== undefined) {
      return months[mo];
   } else {
      throw new UserException("InvalidMonthNo");
   }
}

try {
   // 試みる文
   var myMonth = 15; // 15 は範囲外であり、例外が発生する
   monthName = getMonthName(myMonth);
} catch (e) {
   monthName = "unknown";
   logMyErrors(e.message, e.name); // エラーハンドラに例外オブジェクトを渡す
}

例: オブジェクトを投げるもうひとつの例

次の例では入力文字列で U.S. zip コードのテストをします。もし zip コードが無効な書式を使っていたなら、throw 文は ZipCodeFormatException 型のオブジェクトを生成して例外を投げます。

/*
 * ZipCode オブジェクトを生成します。
 *
 * zip コードとして受け入れられる書式は次のとおりです:
 *    12345
 *    12345-6789
 *    123456789
 *    12345 6789
 *
 * もし ZipCode コンストラクタに渡された引数が、これらのパターンの
 * うちひとつにも確かめられないのなら、例外が投げられます。
 */

function ZipCode(zip) {
   zip = new String(zip);
   pattern = /[0-9]{5}([- ]?[0-9]{4})?/;
   if (pattern.test(zip)) {
      // zip コードの値は文字列中の最初の一致部分です
      this.value = zip.match(pattern)[0];
      this.valueOf = function() {
         return this.value
      };
      this.toString = function() {
         return String(this.value)
      };
   } else {
      throw new ZipCodeFormatException(zip);
   }
}

function ZipCodeFormatException(value) {
   this.value = value;
   this.message = "does not conform to the expected format for a zip code";
   this.toString = function() {
      return this.value + this.message;
   };
}

/*
 * これは、US の住所のためのアドレスデータを検証するスクリプトで
 * 使われるかもしれません。
 */

const ZIPCODE_INVALID = -1;
const ZIPCODE_UNKNOWN_ERROR = -2;

function verifyZipCode(z) {
   try {
      z = new ZipCode(z);
   } catch (e) {
      if (e instanceof ZipCodeFormatException) {
         return ZIPCODE_INVALID;
      } else {
         return ZIPCODE_UNKNOWN_ERROR;
      }
   }
   return z;
}

a = verifyZipCode(95060);         // 95060 を返します
b = verifyZipCode(9560);          // -1 を返します
c = verifyZipCode("a");           // -1 を返します
d = verifyZipCode("95060");       // 95060 を返します
e = verifyZipCode("95060 1234");  // 95060 1234 を返します

例: 例外を再度投げる

例外を捕捉した後、その例外を再度投げるために throw を使うことができます。次の例では、数値である例外を捕捉し、もしその値が 50 を超えるのなら、それを再度投げます。再度投げられた例外は、利用者がわかるように、囲んでいる関数またはトップレベルにいたるまで伝播します。

try {
   throw n; // 数値である例外を投げる
} catch (e) {
   if (e <= 50) {
      // 1 から 50 の例外を操作するための文
   } else {
      // この例外を操作できないので、再度投げる
      throw e;
   }
}

仕様

仕様書 策定状況 コメント
ECMAScript 3rd Edition (ECMA-262) 標準 最初期の定義。JavaScript 1.4 で実装。
ECMAScript 5.1 (ECMA-262)
throw statement の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
throw statement の定義
標準  
ECMAScript 2017 Draft (ECMA-262)
throw statement の定義
ドラフト  

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) (有) (有) (有) (有)
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) (有) (有) (有) (有)

参照

ドキュメントのタグと貢献者

 このページの貢献者: yyss, teoli, ethertank, Mgjbot, Nanto vi
 最終更新者: yyss,