Chapter 16

エラーハンドリングをしっかりやろう

uki00a
uki00a
2021.05.04に更新

例外を握りつぶないようにしよう

Denoでは、キャッチされていない例外やPromiseがあると、プロセスが停止します。[1]

それを避けるため、以下のように例外を無視するということをやってしまうかもしれません。(「例外を握りつぶす」などといったりします)

try {
  doSomething();
} catch {} // 例外を無視する

しかし、これはエラーハンドリングの方法としては、あまり理想的ではありません。

もしdoSomething関数にバグがあった場合、それを見落とす原因になってしまうためです。

意図的に例外を握りつぶしている場合は、コメントでその理由をしっかり記述しておくとよいでしょう。

try {
  doSomething();
} catch {
  // 〜のため、ここではエラーを無視しています。
}

こういう場合、具体的に何をしたらいいの?

アプリケーションの要件や状況などに応じて何をすべきかは異なりますが、一例を上げると、以下のような処理を実行することが多いのではないかと思います。

  • 失敗した処理のリトライを試みる
  • Sentryなどのエラー監視サービスへ通知する
  • メールなどで管理者へ通知する
  • ロギングする

また、こういったエラーハンドリングに関わるロジックはソースコード中で分散しがちなので、一元化しておくとよいでしょう。例えば、Oakフレームワークを使用してAPIサーバを開発している場合は、エラーハンドリング用のミドルウェアを用意することで、エラーハンドリングのロジックを一元化することができます。

どうやってこういうコードを防げばいいの?

deno lintを使うと、空のブロックを探すことができるので、そちらを活用するとよいでしょう。

また、コードレビューでこういったコードが含まれていないか確認するのも有効です。

ポイント

  • 例外を握りつぶすのを避けよう
  • deno lintコマンドやコードレビューによって例外の握りつぶしを防止しよう
脚注
  1. Node.jsにおけるprocess.on("uncaughtException", handler)などのように、グローバルでエラーを検知する仕組みは現時点ではDenoにはありません。 ↩︎