例外がcatchされなかった時のリスナー(typescript)
どうも、かな入力エンジニアでお馴染み伊藤くんです。
今回は伊藤くんが今まで地味に知らなかった、typescriptでの例外がcatchされなかった時のリスナーの作り方を調べたのでメモしておきます。
書き方
とりあえずこんな感じです。
// catchされなかったexception
process.on('uncaughtException',err => {
// ログとかの処理
process.exit(1);
});
// catchされなかったreject
process.on('unhandledRejection',(err, p) => {
// ログとかの処理
process.exit(1);
});
まあなんというか、あーね。って感じですね。
第二引数のコールバック関数の引数にエラーメッセージなどが入っています。
下はpromiseでrejectがcatchされなかった時とかのやつです。
注意点
そもそもこのリスナーに到達している時点で完全に想定外の例外なわけで、このリスナーで握り潰してプログラムを続行するのはなかなかに危険です。
ので、基本的にこのリスナーの最後はprocess.exit(1) ;でプログラムを強制終了させるべきだそうです。
もうちょい細かい話をすると、unhandledRejectionの方は別にprocess.exit(1);をしなければ、というわけでも無いそうです。
この辺りは難しい話っぽく、伊藤くんの理解の範疇を超えているので参考ページだけ載せておきます。
参考 : https://yosuke-furukawa.hatenablog.com/entry/2016/07/12/103734
伊藤くんはpuppetterを使ったスクレイピングをするアプリで、想定外の例外が起きた時にどんな画面で起きたのかをスクショとして保存したいと思い、このリスナーでスクショを撮ってから強制終了する、という処理を書いたのですが、多分それはあまりよくないんだと思います。
このリスナーの中でまた想定外の例外が発生したら、絶望的なリスナー無限ループに陥るからです。実際伊藤くんもやらかしました。
ので、おそらくこのリスナーでやるのは本当に簡単なログの出力などに止めておいたほうがいいと思います。
コメントを残す