りゅうじの学習blog

学習したことをアウトプットしていきます。

5/14 TypeScript 例外処理

throw文とErrorオブジェクト

console.log("エラーを発生させます");
throwError();
console.log("エラーを発生させました");

function throwError() {
  const error = new Error('エラーが発生しました');
  throw error;
}

実行結果(paiza.ioを使用)

エラーを発生させます
/workspace/Main.ts:6
  const error = new Error('エラーが発生しました');
                ^

Error: エラーが発生しました
    at throwError (/workspace/Main.ts:6:17)
    at Object.<anonymous> (/workspace/Main.ts:2:1)
    at Module._compile (node:internal/modules/cjs/loader:1126:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1180:10)
    at Module.load (node:internal/modules/cjs/loader:1004:32)
    at Function.Module._load (node:internal/modules/cjs/loader:839:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47
  • エラーを発生させますのみがconsole.logの出力です
  • エラーが発生した場合の主な情報はエラーメッセージとエラーがどこで発生したかです
  • at で始める出力はスタックトレースです
    • スタックトレースとは、エラーが発生するまでにプログラムがどのような経緯をたどって実行されてきたかの情報です
  • エラーを発生させましたのconsole.logの出力がありません
    • エラーが発生したらプログラムの実行はそこで中断されるからです

ランタイムエラーが発生すると問答無用でプログラムが終了します、このことをクラッシュとも呼ばれます。

クラッシュが発生するのは良くないという場面もあり、エラーが発生してもプログラムを実行し続けるために、try-catch文があります。

例外をキャッチするtry-catch文

try {
    console.log('エラーを発生させます');
    throwError();
    console.log('エラーを発生させました');
} catch (err) {
    console.log('エラーをキャッチしました');
    console.log(err);
}
console.log('おわり');

function throwError() {
    const error = new Error('エラーが発生しました');
    throw error;
}

実行結果

エラーを発生させます
エラーをキャッチしました
/workspace/Main.ts:12
    const error = new Error('エラーが発生しました');
                  ^

Error: エラーが発生しました
    at throwError (/workspace/Main.ts:12:19)
    at Object.<anonymous> (/workspace/Main.ts:3:5)
    at Module._compile (node:internal/modules/cjs/loader:1126:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1180:10)
    at Module.load (node:internal/modules/cjs/loader:1004:32)
    at Function.Module._load (node:internal/modules/cjs/loader:839:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47
おわり
  • tryブロックが実行される
    • エラーを発生させますが出力され、throwError()が実行されるのでエラーを発生させましたは出力されない
  • tryでエラーが発生したのでcatchブロックに移ります
  • 最後におわりが出力されているのでtry-catch文が終わって次のプログラムが実行されていることが確認できる

参考

プロを目指す人のためのTypeScript入門