0Pricing
TypeScript Academy · レッスン

エラーを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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. エラーをthrowすることの問題
  2. Result型のモデル化
  3. Option型とMaybe型
  4. Railway-Oriented Programming
← TypeScript Academyに戻る