同期・非同期エラーを捕捉して処理する
// ── 基本: try/catch でエラーを捕捉する ──────────────────
async function loadData(url: string) {
try {
// ── try ブロック: 正常系の処理 ──
const response = await fetch(url);
if (!response.ok) {
// fetch は HTTP エラーでも throw しないので手動でチェック
throw new Error('HTTP エラー: ' + response.status);
}
const data = await response.json();
return data;
} catch (error) {
// ── catch ブロック: エラーが発生したら実行 ──
// instanceof でエラーの種類を判別する
if (error instanceof TypeError) {
// ネットワーク接続失敗など
console.error('ネットワークエラー:', error.message);
} else if (error instanceof SyntaxError) {
// JSON のパース失敗
console.error('JSONの形式が不正:', error.message);
} else if (error instanceof Error) {
console.error('エラー:', error.message);
} else {
throw error; // 想定外は再スローして上位に伝える
}
return null;
} finally {
// ── finally: 成功・失敗に関わらず必ず実行 ──
setLoading(false); // ローディング解除
}
}TypeScriptではcatchのerrはunknown型。instanceof等で型を絞り込む。finallyはreturnやthrowの後でも必ず実行される。