try...catch 文内の関数の例外処理
【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム
【tryブロックの中から呼び出し他関数内で例外が発生した場合】
try...catch 文の書式は次のようになっており、例外が発生する可能性がある文を try のあとのブロック内に記述しておく必要があります。
try...catch 文の書式は次のようになっており、例外が発生する可能性がある文を try のあとのブロック内に記述しておく必要があります。
・書式
try{ 例外が発生する可能性がある文を記述 ・・・ } catch(e) { 例外をキャッチしたときに実行される処理 ・・・ }
それでは try ブロックの中で try...catch 文の外に記述された関数を呼びだし、その関数内で例外がスローされた場合
function func(){ // ここで例外が発生 } try{ func(); } catch(e) { 例外をキャッチしたときに実行される処理 ・・・ }
サンプル
function sum(a, b){ let sum; sum = a + b; return sum; } console.log('Start'); try{ console.log(sum(10, 8)); console.log(sum(10, 8n)); } catch(e) { console.error(e); } console.log('End'); 実行 > Start > 18 > TypeError: Cannot mix BigInt and other types, use explicit conversions > End
今回のサンプルでは例外が発生する可能性のある関数を try ブロック内に記述するのではなく、関数を呼びだす文を try ブロックの中に記述しています。
呼びだした関数は try ブロック内には記述されていませんが、このようなケースであっても関数がスローした例外を関数の呼び出し側でキャッチして処理することができます。
function sumB(a, b){ let sum; sum = a + b; return sum; } function sumA(a, b){ return sumB(a, b); } console.log('Start'); try{ console.log(sumA(10, 8)); console.log(sumA(10, 8n)); } catch(e) { console.error(e); } console.log('End'); 実行 >> Start >> 18 >> TypeError: Cannot mix BigInt and other types, use explicit conversions >> End
先ほどのサンプルを少し修正し、間にもう一つ関数をはさみました。このような場合であっても最終的に呼び出された関数でスローされた例外は、呼び出し元を順にさかのぼっていき、いずれかのところで try...catch 文を使って例外をキャッチできれば例外に対する処理を行うことができます。
【非同期処理のコールバック関数で例外が発生した場合】
コールバック関数の中で発生した例外はキャッチすることは出来ない!
サンプル
console.log('Start'); try{ setTimeout(function sum(a, b){ let sum = a + b; console.log(sum); },1000, 10, 8n); } catch(e) { console.error('例外をキャッチしました'); } console.log('End'); 実行 > Start > End > Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
このサンプルを実行してみると、コールバック関数内で発生した例外は try...catch 文でキャッチすることができずにエラーをコンソールに出力してプログラムが強制終了してしまいました。これはコールバック関数は try ブロック内にあってもコールバック関数を呼びだしているのは try ブロックの外からだからエラーになる。