TypeScript エラー処理初心者ガイド

効果的なエラー処理はどのプログラミング言語でも重要であり、TypeScript も例外ではありません。適切なエラー処理は、予期しない状況を適切に管理することで、堅牢で信頼性の高いアプリケーションの作成に役立ちます。このガイドでは、TypeScript のエラー処理の基本について説明し、初心者向けの実用的な例を示します。

TypeScript のエラーを理解する

TypeScript のエラーは、JavaScript と同様に、実行時またはコンパイル時に発生します。TypeScript は、コンパイル時に多くの潜在的な問題を検出できる型の安全性を提供しますが、実行時エラーは適切に管理する必要があります。

trycatch を使用した基本的なエラー処理

TypeScript では、try ブロックと catch ブロックを使用して実行時エラーを処理します。このアプローチにより、エラーをスローする可能性のあるコードを実行し、エラーが発生した場合にそのエラーを処理できます。

trycatch の例

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new Error("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    console.error(error.message);
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Cannot divide by zero

この例では、divide 関数は 2 つの数値を除算しようとします。除数が 0 の場合、エラーがスローされ、catch ブロックによってキャッチされ、エラー メッセージがログに記録されます。

カスタムエラータイプ

TypeScript を使用すると、特定のエラー状態をより適切に表すためにカスタム エラー タイプを定義できます。カスタム エラー タイプは、エラーを分類し、より効率的に処理するのに役立ちます。

カスタムエラータイプの作成

class DivisionError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "DivisionError";
  }
}

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new DivisionError("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    if (error instanceof DivisionError) {
      console.error(`Custom Error: ${error.message}`);
    } else {
      console.error("An unexpected error occurred");
    }
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Custom Error: Cannot divide by zero

ここでは、組み込みの Error クラスを拡張するカスタム エラー クラス DivisionError を定義します。このカスタム エラーを divide 関数で使用して、より具体的なエラー処理を提供します。

instanceof による型保護

instanceof のような型ガードは、catch ブロック内のエラー オブジェクトの型を絞り込むのに役立ち、異なるエラー タイプを異なる方法で処理できるようになります。

型保護の例

function processInput(input: string | number) {
  try {
    if (typeof input === "string") {
      console.log(input.toUpperCase());
    } else {
      throw new Error("Input must be a string");
    }
  } catch (error) {
    if (error instanceof Error) {
      console.error(`Error: ${error.message}`);
    } else {
      console.error("An unknown error occurred");
    }
  }
}

processInput("hello"); // Output: HELLO
processInput(42); // Output: Error: Input must be a string

この例では、catch ブロックで型の保護を示し、エラー オブジェクトが Error のインスタンスであることを保証し、正確なエラー処理を可能にします。

クリーンアップに finally を使用する

finally ブロックは、エラーが発生したかどうかに関係なく実行する必要があるコードを実行するために使用できます。これは、ファイルを閉じたり、リソースを解放したりするなどのクリーンアップ操作に役立ちます。

finally の例

function readFile(filePath: string): string {
  try {
    // Simulate reading a file
    if (filePath === "") {
      throw new Error("File path cannot be empty");
    }
    return "File content";
  } catch (error) {
    console.error(`Error: ${error.message}`);
    return "";
  } finally {
    console.log("Cleanup: Closing file");
  }
}

console.log(readFile("path/to/file")); // Output: File content
console.log(readFile("")); // Output: Error: File path cannot be empty
                            //         Cleanup: Closing file

この例では、finally ブロックにより、エラーが発生したかどうかに関係なく、クリーンアップ メッセージがログに記録されます。

結論

効果的なエラー処理は、信頼性の高い TypeScript アプリケーションを構築する上で非常に重要です。trycatch、カスタム エラー タイプ、タイプ ガード、finally を使用すると、エラーをより効果的に管理し、予期しない状況が発生した場合でもアプリケーションが予測どおりに動作することを保証できます。

これらのテクニックを使用すると、エラーを適切に処理し、TypeScript コードの堅牢性を向上させることができます。これらの概念を実践して、TypeScript のエラー処理に習熟し、より回復力のあるアプリケーションを作成しましょう。