TypeScript上級

上級 TypeScriptで学ぶ例外設計|練習問題編

導入

TypeScriptを用いた開発では、例外設計がシステムの堅牢性を左右します。特に、外部APIとの連携やデータベース操作など、失敗が予想される処理においては、適切な例外処理が不可欠です。本記事では、具体的なシナリオを通じて、例外設計の重要性とその実装方法を探ります。

教科書レベルの解説(例外設計)

重要な概念の整理

例外設計においては、例外が発生する可能性のある場所を特定し、どのように処理するかを明確にすることが求められます。特に、エラーハンドリングの戦略として、以下のポイントが挙げられます。

  • 例外の種類を定義する: アプリケーション固有のエラーや外部エラーを区別し、適切に処理します。
  • エラーメッセージの一貫性: ユーザーにとって理解しやすいメッセージを提供することが重要です。
  • リカバリの手段: 例外発生時にどのようにシステムを回復させるか、事前に考慮しておく必要があります。

コード例(TypeScript)


class ApiError extends Error {
    constructor(public statusCode: number, message: string) {
        super(message);
        this.name = 'ApiError';
    }
}

async function fetchData(url: string): Promise {
    try {
        const response = await fetch(url);
        if (!response.ok) {
            throw new ApiError(response.status, 'Failed to fetch data');
        }
        return await response.json();
    } catch (error) {
        if (error instanceof ApiError) {
            console.error(`API Error: ${error.statusCode} - ${error.message}`);
        } else {
            console.error(`Unexpected Error: ${error}`);
        }
        throw error; // 再スローして上位での処理を可能にする
    }
}

コードの行ごとの解説

  1. クラス ApiError: 独自のエラークラスを作成し、APIエラーの状態コードとメッセージを保持します。
  2. fetchData関数: 指定されたURLからデータを取得し、成功した場合にはJSONを返します。
  3. エラーハンドリング: レスポンスが正常でない場合にApiErrorをスローし、catchブロックでエラーを処理します。
  4. 再スロー: エラーを再スローすることで、上位の呼び出し元で追加の処理を行えるようにします。

練習問題編

以下の練習問題に挑戦し、例外設計の理解を深めてください。

  1. 問題1: fetchData関数に、タイムアウトエラーを追加してください。

    模範解答: setTimeoutを使用して、指定時間内にレスポンスが得られなければエラーをスローします。

  2. 問題2: ApiErrorクラスに、エラーの発生時刻を記録するプロパティを追加してください。

    模範解答: コンストラクタに新しいプロパティを追加し、生成時に新しいDateオブジェクトを設定します。

  3. 問題3: fetchData関数のエラーハンドリングを改善し、ユーザーにエラーの詳細を表示する方法を考えてください。

    模範解答: エラーが発生した際に、ユーザー向けのメッセージを生成し、UI上に表示する処理を追加します。

まとめ

  • 例外設計は、システムの信頼性を高めるための重要な要素です。
  • 適切なエラーハンドリングを行うことで、ユーザー体験を向上させることが可能です。
  • 練習問題を通じて、実際の業務に役立つスキルを身につけてください。