throw
ユーザー定義による例外をスローします。
現在の関数の実行を止め(throwの後の処理文は実行されません。)、
制御がコールスタック内の最初のcatchブロックへ渡されます。
もし、呼び出し元の関数の中にcatch
ブロックが無ければ、そのプログラムは終了します。
文法
throw 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 |
---|---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ |
関連項目
© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
- 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
- MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。