JavaScriptにおける例外のスロー
JSONプロダクトのタスクにおける catch ブロックを見てみましょう:
catch (error) {
if (error.name == 'SyntaxError') {
alert('不正なプロダクトJSON');
} else if (error.name == 'ProductCostError') {
alert('プロダクトに価格または数量がありません');
}
}
ご覧の通り、我々は予定していた2つの例外をキャッチし、
それに対して何らかの対応をしています。
しかし、我々が想定していない別のタイプの例外が
発生した場合はどうなるでしょうか?この場合、
それはやはり catch ブロックに入りますが、
他のタイプの例外は我々のどのif文にも該当しないため、
何の対応も行われません。
何の対応も行われないと言うとき、それは文字通り、 何も起きないという意味です:コンソールにエラーが 表示されることすらありません。 我々のコードはただ黙って動作しないのです。
したがって、次のルールが存在します:あなたのコードは、
対処方法を知っている例外のみをキャッチすべきです。
例外が未知のものであれば、throw を使って
それを スロー(再スロー) する必要があります。
この場合、上位のより知識のある部分がそれをキャッチするか、
または例外がコンソールにエラーとして表示されます。
コードを修正しましょう:
catch (error) {
if (error.name == 'SyntaxError') {
alert('不正なプロダクトJSON');
} else if (error.name == 'ProductCostError') {
alert('プロダクトに価格または数量がありません');
} else {
throw error; // 例外をさらにスローする
}
}
次のコードが与えられています:
try {
let arr = JSON.parse(json);
for (let i = 0; i < arr.length; i++) {
localStorage.setItem(i, arr[i]);
}
} catch (error) {
if (error.name == 'QuotaExceededError') {
alert('ストレージの空き容量が不足しています');
}
if (error.name == 'SyntaxError') {
alert('不正なJSON');
}
}
このコードの何が問題でしょうか?より適切なものに修正してください。