try catch の複数の条件判定について
これまでの投稿でtry catch 文については、深く掘り下げていませんたが、
try catchの基本的な書き方は以下のようになります。
try { //処理 } catch(e) { //エラー時の処理 } finally { //最終的に必ず実行する処理 }
まず、tryで通常の処理を行い、この中で何らかのエラーが発生した場合や、throw文によって例外が投げられると、catchブロックに処理が移ります。
この時、catch文を複数書くことができます。
try { //処理 } catch(e) { //エラー時の処理1 } catch(e) { //エラー時の処理2 } catch(e) { //エラー時の処理3 } finally { //最終的に必ず実行する処理 }
このように複数書く場合は、catch(e)の引数eについて、条件判定する書き方があります。
具体的には次のように書きます。
//書き方の例1 catch(e if e instanceof TypeError) //書き方の例2 catch(e if e instanceof RangeError) //書き方の例3 catch(e if e instanceof EvalError)
上記は3通りのcatch文の引数の判定方法を書きましたが、現状のjavascriptプログラミングでは複数のcatch文は推奨はされていませんし、ブラウザによっては正常に動作しない場合があるので、注意が必要です。
また、上記の
TypeError RangeError EvalError
等は、javascriptの標準ビルトインオブジェクトであり、その中の基本オブジェクトとしてあらかじめ定義されているものです。
(詳しくは、MDN web docsに記載されています)
上記以外には、上記の3通りのオブジェクトも含め、下記のようなものが定義されています。
EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError
また、例のコードには書きませんでしたが、下記のような反映も書くことができます。
//tryブロックの中で、throw new Error("err1"); のように例外が投げられた場合 catch(e if e === "err1") //throwされた例外が数値だった場合 catch(e if typeof e === "number")
いずれもcatchについての書き方になりますが、あまり複数のcatchを前提で開発を進めないほうが良いかもしれません。
またtry catch句について調べたら当記事を更新しようと思います。