導入
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; // 再スローして上位での処理を可能にする
}
}
コードの行ごとの解説
- クラス ApiError: 独自のエラークラスを作成し、APIエラーの状態コードとメッセージを保持します。
- fetchData関数: 指定されたURLからデータを取得し、成功した場合にはJSONを返します。
- エラーハンドリング: レスポンスが正常でない場合にApiErrorをスローし、catchブロックでエラーを処理します。
- 再スロー: エラーを再スローすることで、上位の呼び出し元で追加の処理を行えるようにします。
練習問題編
以下の練習問題に挑戦し、例外設計の理解を深めてください。
-
問題1: fetchData関数に、タイムアウトエラーを追加してください。
模範解答: setTimeoutを使用して、指定時間内にレスポンスが得られなければエラーをスローします。
-
問題2: ApiErrorクラスに、エラーの発生時刻を記録するプロパティを追加してください。
模範解答: コンストラクタに新しいプロパティを追加し、生成時に新しいDateオブジェクトを設定します。
-
問題3: fetchData関数のエラーハンドリングを改善し、ユーザーにエラーの詳細を表示する方法を考えてください。
模範解答: エラーが発生した際に、ユーザー向けのメッセージを生成し、UI上に表示する処理を追加します。
まとめ
- 例外設計は、システムの信頼性を高めるための重要な要素です。
- 適切なエラーハンドリングを行うことで、ユーザー体験を向上させることが可能です。
- 練習問題を通じて、実際の業務に役立つスキルを身につけてください。