エラーをthrowすることの問題
例外によって型システムから失敗が見えなくなる理由を学びます。
「エラーをthrowすることの問題」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
例外は見えない
関数がthrowしても、そのことはシグネチャに示されません。型システムには、どの関数が失敗する可能性があるか分からないため、呼び出し側にはエラー処理を促すコンパイラー上の仕組みがありません。
例外を投げる関数
この関数は常に数値を返すように見えますが、例外を投げる可能性があります。戻り値の型numberだけでは、失敗するケースが完全に隠れてしまいます。
function parsePort(s: string): number {
const n = Number(s);
if (Number.isNaN(n)) throw new Error("bad port");
return n;
}
console.log(parsePort("8080")); // 8080呼び出し側は捕捉を忘れる
呼び出し側に、呼び出しをtry/catchで囲むことを強制するものは何もありません。この誤りは問題なくコンパイルされ、実行時にクラッシュして初めて明らかになります。
const port = parsePort("oops");
// No compile error; throws at runtime, possibly crashing the app.try/catch で型が失われる
捕捉したとしても、捕捉された値の型はunknown(またはany)です。エラーの構造は追跡されないため、処理は推測に頼ることになります。
try {
parsePort("x");
} catch (e) {
// e: unknown -> you must narrow it manually
}エラーを値として扱う
別の方法は、失敗を例外として投げるのではなく、関数が返す通常の値にすることです。そうすれば、戻り値の型に成功と失敗の両方が正直に示されます。
値を返す形の例
例外を投げる代わりに、成功または失敗を示すタグ付きオブジェクトを返します。呼び出し側は、値を使う前にその内容を確認する必要があります。
type ParseResult =
| { ok: true; value: number }
| { ok: false; error: string };型が真実を示すようになる
ParseResultを返す関数は、失敗する可能性があることを明示します。そのためコンパイラーは、呼び出し側に失敗の分岐を処理するよう要求します。
function parsePort(s: string): ParseResult {
const n = Number(s);
return Number.isNaN(n)
? { ok: false, error: "bad port" }
: { ok: true, value: n };
}処理を強制する
値がどちらの分岐にもなり得るため、まずokを確認しなければvalueを読み取れません。コンパイラーは、確認の後でのみ型を絞り込みます。
const r = parsePort("oops");
if (r.ok) console.log(r.value);
else console.log("failed:", r.error);例外にも使いどころがある
本当に予期せず、回復できない失敗(プログラマーのバグやメモリ不足など)については、依然として例外を投げることができます。エラーを値として扱う方法は、解析やバリデーションのような想定される失敗で特に効果を発揮します。
暗黙より明示
エラーを返すと、失敗の経路が型に明示され、呼び出し箇所から見えるようになり、隠れたthrowとは違って誤って無視することができなくなります。
Result と Option へ
この成功または失敗を示すタグ付きの形は再利用可能なResult型へと一般化でき、不在と存在を示す形はOptionへと一般化できます。どちらも次で扱います。
理解度チェック
このレッスンの理解度を確認します。
まとめ
投げられたエラーは型から見えません。シグネチャには失敗が示されず、呼び出し側は捕捉を忘れてしまいます。失敗を明示的な値(成功またはエラーを示すタグ付きオブジェクト)として返すと、失敗の経路が型に示され、無視できなくなります。これがResult型とOption型につながります。
よくある質問
「エラーをthrowすることの問題」レッスンは無料ですか?
はい。「エラーをthrowすることの問題」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「エラーをthrowすることの問題」で何を学びますか?
例外によって型システムから失敗が見えなくなる理由を学びます。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「エラーをthrowすることの問題」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- エラーをthrowすることの問題
- Result型のモデル化
- Option型とMaybe型
- Railway-Oriented Programming