throw

ユーザー定義による例外をスローします。 現在の関数の実行を止め(throwの後の処理文は実行されません。)、 制御がコールスタック内の最初のcatchブロックへ渡されます。 もし、呼び出し元の関数の中にcatchブロックが無ければ、そのプログラムは終了します。

文法

throw expression;
expression
スローする式を指定します。

説明

例外をスローする際にthrow文を使用します。 例外をスローする際に、expressionは例外の値を指定します。 下記は、それぞれ例外をスローしています。

throw "Error2"; // 文字列値の例外を生成
throw 42;       // 42の値の例外を生成
throw true;     // trueの値の例外を生成

throw文はthrowキーワードと式の間に終端行は無いものとして、 自動セミコロン挿入(automatic semicolon insertion - ASI)の影響を受ける事に注意してください。

例: オブジェクトのスロー

例外のスローに、オブジェクトを指定することが可能で、 catchブロック内でオブジェクトのプロパティを参照することが出来ます。 下記は、UserException型のmyUserExceptionオブジェクトを作成し、 それを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 {
   // tryの文
   var myMonth = 15; // 例外を発生させるため、範囲外の15を指定
   monthName = getMonthName(myMonth);
} catch (e) {
   monthName = "unknown";
   logMyErrors(e.message, e.name); // エラーハンドラへ例外オブジェクトを渡します
}

別のオブジェクトのスロー例

下記の例は、入力された文字列がU.Sの郵便番号であるかを検証します。 もし、そのU.Sの郵便番号が不正なフォーマットであれば、 throw文はZipCodeFormatException型のオブジェクトを作成し、例外をスローします。

/*
 * U.Sの郵便番号オブジェクトを作成
 *
 * 受け入れられるU.Sの郵便番号フォーマットは下記の通り
 *
 *    12345
 *    12345-6789
 *    123456789
 *    12345 6789
 *
 * もし、ZipCodeコンストラクタへ渡された引数が、
 * これらのパターンの1つであると確認出来なければ、例外がスローされます。
 */

function ZipCode(zip) {
   zip = new String(zip);
   pattern = /[0-9]{5}([- ]?[0-9]{4})?/;
   if (pattern.test(zip)) {
      // zip code value will be the first match in the string
      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
   };
}

/*
 * This could be in a script that validates address data
 * for US addresses.
 */

var ZIPCODE_INVALID = -1;
var 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);         // returns 95060
b = verifyZipCode(9560);          // returns -1
c = verifyZipCode("a");           // returns -1
d = verifyZipCode("95060");       // returns 95060
e = verifyZipCode("95060 1234");  // returns 95060 1234

例: 例外の再スロー

例外をcatchした後に、throwを使用して例外を再度スローすることが可能です。 下記の例では数値である例外をcatchし、それが50以上であれば再度スローします。 再スローされた例外は、それを囲い込んでいる関数またはユーザーが目にすることに成るトップ階層へ伝搬します。

try {
   throw n; // 数値である例外をスロー
} catch (e) {
   if (e <= 50) {
      // 1~50の例外を取り扱う処理文
   } else {
      // この例外をこれ以上ここでは取り扱えないため、再スロー
      throw e;
   }
}

仕様

ブラウザ互換性

デスクトップ
機能 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の更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。