Posted at

TypeScriptを利用した場合の例外の基本設計

More than 1 year has passed since last update.

『TypeScript実践プログラミング』より自分用メモ。


ポイント



  • Errorインターフェースの実装


    • 効果:namemessageプロパティがカスタムクラスに確実に定義される




  • toStringのオーバーライドの推奨


    • 理由:このメソッドをオーバーラードしないと、デフォルト実装であるObject#toString()が呼ばれ、[object Object]が出力される



  • ネイティブのErrorは聖域として扱い、決してスローしないこと。


    • 理由:アプリケーションの例外とErrorとの明確な分離



以下の例では



  • ApplicationError をアプリケーションのルートのカスタム例外クラスとしている

  • 必要に応じてInputErrorなどの子カスタム例外クラスをサポート

class ApplicationError implements Error {

public name = 'ApplicationError';

constructor(public message: string) {
}

toString() {
return this.name + ': ' + this.message;
}
}

class InputError extends ApplicationError {
}

function errorsOnThree(input: number) {
if (input === 3) {
throw new InputError('Three is not allowed');
}
return input;
}


補足

Javaのtry-catch節のような、特定の型の例外のみに適用させるcatch節を書くことは現状できない。try-catch節で例外ごとの処理を加えたい場合は、適切なinstanceof による条件分岐を加えれば良い。

try {

//...
} catch(err) {
if (err instanceof ApplicationError) {
console.error('Error caught, no action taken');
}
throw err;
}