TypeScriptでのエラー設計
センチネルエラー
近年はもっぱらextends Errorを伴った拡張エラークラスを使用するようにしています。
メソッドの実装もconstructorの実装もなく、ただextends Errorを書き加えたのみです。
こうすることで、エラー送出側でthrow new ForbiddenError()やthrow new InternalServerError()と書くことができます。
変数errがany型だった時代は、たしかにいくつかの方法論を取りうると感じました。そこからunknown型となりinstanceof演算子の使用が必須となった今では、message.includes()を使うよりも、さっさとErrorのサブクラスを作ってしまってそれで分岐したほうがcatchブロック内をシンプルに扱えます。
extends ErrorすることによってECMAScript処理系の標準的なエラーログ表示の恩恵を受けることができます。
個人的にはここに更にインスタンスのnameプロパティに書き込むようにしています。例えば以下のような感じです。
code:memo.ts
class FooError extends Error {
name = "FooError";
}
こうすることでスタックトレースの文字列にどのエラーが発生したかを残すことが出来ます。
エラーのラップ
独自エラー型