🕔

[読書メモ]オブジェクト設計スタイルガイド 5章2節 with TypeScript

2024/02/25に公開

オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
https://www.oreilly.co.jp/books/9784814400331/

5.2 例外に関するルール

5.2.1 カスタム例外クラスは必要な場合にのみ使う

  1. 特定の例外型を上位で捕捉したい場合
// カスタム例外クラスの定義
class MyCustomError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "MyCustomError";
  }
}

// カスタム例外を投げて、特定の型を捕捉する例
try {
  throw new MyCustomError("This is a custom error!");
} catch (error) {
  if (error instanceof MyCustomError) {
    console.log("Caught MyCustomError:", error.message);
  } else {
    console.log("Caught other error:", error);
  }
}
  1. ひとつの例外をインスタンス化する方法が複数必要な場合
// カスタム例外クラスの定義
class ComplexError extends Error {
  constructor(message: string);
  constructor(code: number, message: string);
  constructor(arg1: string | number, arg2?: string) {
    super(typeof arg1 === "string" ? arg1 : arg2);
    this.name = "ComplexError";
    if (typeof arg1 === "number") {
      console.log(`Error code: ${arg1}`);
    }
  }
}

// インスタンス化の例
try {
  // 文字列を使ってインスタンス化
  throw new ComplexError("Simple error message");

  // 数字と文字列を使ってインスタンス化
  // throw new ComplexError(404, "Not found");
} catch (error) {
  console.log(error.message);
}
  1. 例外のインスタンス作成をするために名前付きコンストラクタを使いたい場合
// カスタム例外クラスの定義
class NamedConstructorError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "NamedConstructorError";
  }

  // 名前付きコンストラクタとしての静的メソッド
  static fromHttpStatus(status: number): NamedConstructorError {
    return new NamedConstructorError(`HTTP Error: ${status}`);
  }
}

// 名前付きコンストラクタを使ってインスタンス化する例
try {
  throw NamedConstructorError.fromHttpStatus(404);
} catch (error) {
  if (error instanceof NamedConstructorError) {
    console.log("Caught NamedConstructorError:", error.message);
  }
}

Discussion