try catch構文
構文
1 2 3 4 5 6 7 |
try { 例外が発生する可能性がある命令 } catch (例外を受け取る変数) { 例外が発生した際に実行する命令 } finally { 例外有無に関わらず最終的に実行される命令 } |
もし、try-catch構文を書いていない場合は例外が発生した瞬間プログラムが停止してしまいます。
例
1 2 3 4 5 6 |
try{ x = 0 if (x === 0) { throw new Error('エラーが発生しました。'); } } catch(e) { console.log(e.message); } |
throw new Error('エラーメッセージ')
例外は自然発生もしますが、意図的に発生させることも可能です。上記例ではErrorオブジェクトを使ってますが発生するErrorが絞れているのであれば下記のような
オブジェクト | 原因 |
---|---|
EvalError | 不正なeval関数 |
RangeError | 指定された値が許容範囲を超えている。 |
ReferenceError | 宣言されていない変数にアクセスした。 |
SyntaxError | 文法エラー |
TypeError | 指定された値が期待されたデータ型ではない。 |
URIError | 不正なURI |
e
Errorオブジェクトになります。messegeプロパティでエラーメッセージを取得することが可能です。
非同期処理の場合
ES5以降の構文になりますが、Promiseオブジェクトのcatchメソッドを使わないと例外をキャッチできないです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function hidouki() { return new Promise((resolve, reject) => { setTimeout(() => { reject("エラー発生"); }, 100); }); } hidouki().then(text => { console.log(text); }) .catch(error => { console.log(error); }); |
他にも非同期の例外をキャッチする方法は以下のように色々あるので調べてみてください。
- async catchを使う方法
- axiosの構文を用いてcatchする方法
キャッチ内での処理
console.logに例外内容を出力する方法
例外メッセージを下記のように出力します。これだけしているのはあまりみないかもしれません。
1 2 3 |
} catch (e) { console.log(e.message).; } |
throwする。
比較的よく見るパターンです。Errorオブジェクト自身をcatch内で再度throwすることでスタックトレースのような物をコンソールに出力してくれます。
1 2 3 |
} catch (e) { throw e; } |
用途
最近のJavaScript開発ではtry-catch構文を使用する場面としてはAPIを実行する部分でしょう。APIはアプリの外部の話になるので内部要因だけではエラーを潰せないためです。
注意点
try-catch構文を使って記述する例外処理はかなりオーバーヘッドが大きい処理になります。なので、ループ処理の中に記述するなどは避けておいた方が無難です。
この記事へのコメントはありません。