【TypeScript】エラー処理と型安全性の基礎

TypeScript

TypeScriptでは、エラー処理を型安全に行うことでコードの信頼性を向上させることができます。

本記事では、try-catch構文を使用した例外処理を中心に、簡単なカスタムエラー型の定義方法や非同期エラー処理まで、エラーを型安全に扱う方法の基礎を解説します。

例外処理の基本

JavaScriptと同様、TypeScriptでは構文を使って例外を処理します。ただし、TypeScriptでは例外オブジェクトの型を指定することで、コードの可読性や保守性を高めることができます。

以下のサンプルプログラムでは、意図的にエラーをスローして例外を発生させています。

TypeScript
try {
    // 実行する処理
    throw new Error("エラーが発生しました");
} catch (error) {
    if (error instanceof Error) {
        console.error(`エラー: ${error.message}`);
    }
}
  • error の型を Error として明示することで、型安全性を確保できます。
  • instanceof を使用してエラーオブジェクトの種類を判定することができます。

カスタムエラー型の定義

TypeScriptでは、開発者自身がエラー型を定義することで、特定のエラーに対応した処理を記述できます。

TypeScript
class CustomError extends Error {
    constructor(public code: number, message: string) {
        super(message);
        this.name = "CustomError";
    }
}

try {
    throw new CustomError(404, "リソースが見つかりません");
} catch (error) {
    if (error instanceof CustomError) {
        console.error(`エラーコード: ${error.code}, メッセージ: ${error.message}`);
    }
}
  • カスタムエラー型は、Error 型を継承(extends)します。
  • カスタムエラー型を作成することで、エラーの種類や詳細を明確に伝えることができます。

非同期エラー処理

非同期処理では try-catch だけでなく、.catchメソッドを使ったエラーハンドリングも行われます。TypeScriptでは、非同期エラー処理でも型安全性を意識することが重要です。

try-catch を使用した非同期エラー処理

TypeScript
async function fetchData(): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => reject(new Error("データの取得に失敗しました")), 1000);
    });
}

(async () => {
    try {
        const data = await fetchData();
        console.log(data);
    } catch (error) {
        if (error instanceof Error) {
            console.error(`非同期エラー: ${error.message}`);
        }
    }
})();

.catch メソッドを使用した非同期エラー処理

TypeScript
function fetchData(): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => reject(new Error("データの取得に失敗しました")), 1000);
    });
}

fetchData()
    .then((data) => {
        console.log(`データ: ${data}`);
    })
    .catch((error) => {
        if (error instanceof Error) {
            console.error(`エラー: ${error.message}`);
        }
    });

使い分けの基準

  • try-catch が選択されるケース
    • 可読性を重視したい場合: 特に async/await を使ったコードは、同期的なコードに見えるため、複雑な処理を記述する場合に可読性が向上します。
    • 複数のエラーが発生する可能性がある場合: 一つの try ブロック内で複数の非同期処理を実行する場合、まとめてエラー処理を行えます。
  • .catch が選択されるケース
    • Promiseチェーンを利用する場合: Promiseチェーンを使ったコードでは .catch メソッドでエラーを処理するのが一般的です。
    • シンプルな非同期処理の場合: 短い処理や、関数呼び出しごとに個別のエラー処理を行いたい場合に適しています。

昨今のモダンなTypeScript/JavaScriptのコードでは、async/await と try-catch の組み合わせが主流です。これにより、非同期処理が同期的なコードと同じような構造になり、理解しやすいコードを書くことができます。
一方で、.catch メソッドも依然として広く使われており、特にPromiseチェーンを利用する場面や短い処理では便利です。

まとめ

エラー処理はアプリケーションの安定性を確保するために重要な部分です。

本記事で紹介した try-catch と .catch メソッドを効果的に使い分けることで、非同期処理も含めて型安全で信頼性の高いコードを実現できます。


本記事についての質問、誤りの指摘、ご意見ご感想などありましたら、ぜひコメント頂ければ幸いです。

それでは、最後までお読みいただき、ありがとうございます。

コメント

タイトルとURLをコピーしました