TypeScript エラー処理初心者ガイド
効果的なエラー処理はどのプログラミング言語でも重要であり、TypeScript も例外ではありません。適切なエラー処理は、予期しない状況を適切に管理することで、堅牢で信頼性の高いアプリケーションの作成に役立ちます。このガイドでは、TypeScript のエラー処理の基本について説明し、初心者向けの実用的な例を示します。
TypeScript のエラーを理解する
TypeScript のエラーは、JavaScript と同様に、実行時またはコンパイル時に発生します。TypeScript は、コンパイル時に多くの潜在的な問題を検出できる型の安全性を提供しますが、実行時エラーは適切に管理する必要があります。
try
と catch を使用した基本的なエラー処理
TypeScript では、try
ブロックと catch
ブロックを使用して実行時エラーを処理します。このアプローチにより、エラーをスローする可能性のあるコードを実行し、エラーが発生した場合にそのエラーを処理できます。
try
と catch の例
function divide(a: number, b: number): number {
try {
if (b === 0) {
throw new Error("Cannot divide by zero");
}
return a / b;
} catch (error) {
console.error(error.message);
return NaN; // Return NaN to indicate an error
}
}
console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Cannot divide by zero
この例では、divide
関数は 2 つの数値を除算しようとします。除数が 0 の場合、エラーがスローされ、catch
ブロックによってキャッチされ、エラー メッセージがログに記録されます。
カスタムエラータイプ
TypeScript を使用すると、特定のエラー状態をより適切に表すためにカスタム エラー タイプを定義できます。カスタム エラー タイプは、エラーを分類し、より効率的に処理するのに役立ちます。
カスタムエラータイプの作成
class DivisionError extends Error {
constructor(message: string) {
super(message);
this.name = "DivisionError";
}
}
function divide(a: number, b: number): number {
try {
if (b === 0) {
throw new DivisionError("Cannot divide by zero");
}
return a / b;
} catch (error) {
if (error instanceof DivisionError) {
console.error(`Custom Error: ${error.message}`);
} else {
console.error("An unexpected error occurred");
}
return NaN; // Return NaN to indicate an error
}
}
console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Custom Error: Cannot divide by zero
ここでは、組み込みの Error
クラスを拡張するカスタム エラー クラス DivisionError
を定義します。このカスタム エラーを divide
関数で使用して、より具体的なエラー処理を提供します。
instanceof による型保護
instanceof
のような型ガードは、catch
ブロック内のエラー オブジェクトの型を絞り込むのに役立ち、異なるエラー タイプを異なる方法で処理できるようになります。
型保護の例
function processInput(input: string | number) {
try {
if (typeof input === "string") {
console.log(input.toUpperCase());
} else {
throw new Error("Input must be a string");
}
} catch (error) {
if (error instanceof Error) {
console.error(`Error: ${error.message}`);
} else {
console.error("An unknown error occurred");
}
}
}
processInput("hello"); // Output: HELLO
processInput(42); // Output: Error: Input must be a string
この例では、catch
ブロックで型の保護を示し、エラー オブジェクトが Error
のインスタンスであることを保証し、正確なエラー処理を可能にします。
クリーンアップに finally
を使用する
finally
ブロックは、エラーが発生したかどうかに関係なく実行する必要があるコードを実行するために使用できます。これは、ファイルを閉じたり、リソースを解放したりするなどのクリーンアップ操作に役立ちます。
finally の例
function readFile(filePath: string): string {
try {
// Simulate reading a file
if (filePath === "") {
throw new Error("File path cannot be empty");
}
return "File content";
} catch (error) {
console.error(`Error: ${error.message}`);
return "";
} finally {
console.log("Cleanup: Closing file");
}
}
console.log(readFile("path/to/file")); // Output: File content
console.log(readFile("")); // Output: Error: File path cannot be empty
// Cleanup: Closing file
この例では、finally
ブロックにより、エラーが発生したかどうかに関係なく、クリーンアップ メッセージがログに記録されます。
結論
効果的なエラー処理は、信頼性の高い TypeScript アプリケーションを構築する上で非常に重要です。try
と catch
、カスタム エラー タイプ、タイプ ガード、finally
を使用すると、エラーをより効果的に管理し、予期しない状況が発生した場合でもアプリケーションが予測どおりに動作することを保証できます。
これらのテクニックを使用すると、エラーを適切に処理し、TypeScript コードの堅牢性を向上させることができます。これらの概念を実践して、TypeScript のエラー処理に習熟し、より回復力のあるアプリケーションを作成しましょう。