10.1 try...catch ブロック
例外処理は、コードの安定性と信頼性を向上させるための重要なプログラミングの側面だよ。 JavaScriptでは、try、catch、finally、throwというキーワードを使って例外を処理するよ。 今回の講義では、これらのキーワード、構文、使い方の例について説明するね。
1. try...catch ブロック
try...catch 構造は、try ブロック内で発生するエラーを処理するために使用されるんだ。もし try ブロック内でエラーが発生すると、catch ブロックに制御が移り、そこでエラーを処理できるよ。
構文:
try {
// 例外を引き起こす可能性のあるコード
} catch (error) {
// 例外を処理するコード
}
この例では、JavaScriptではゼロによる除算はエラーにならないけど、もし他のエラー(例えば未定義の変数へのアクセス)があった場合、 catch ブロックがエラーを処理するよ。
try {
let result = 10 / 0;
console.log(result);
} catch (error) {
console.error('エラーが発生しました:', error);
}
10.2. finally ブロック
finally ブロックは、try ブロック内で例外が発生したかどうかにかかわらず、必ず実行されるコードを実行するために使用されるんだ。finally ブロックは catch ブロックの後に続くよ。
構文:
try {
// 例外を引き起こす可能性のあるコード
} catch (error) {
// 例外を処理するコード
} finally {
// 必ず実行されるコード
}
この例では、エラーが発生したかどうかに関わらず、This will always execute. というメッセージが表示されるよ。
try {
let result = 10 / 0;
console.log(result);
} catch (error) {
console.error('エラーが発生しました:', error);
} finally {
console.log('This will always execute.');
}
10. 3. throw 演算子
throw 演算子は例外を明示的にスローするために使われるんだ。これを使えばカスタムエラーをスローすることができるよ。
構文:
throw expression;
ここでの:
expression: スローされる例外としての任意の式やオブジェクト
使用例
この例では、ゼロで割ろうとするとエラーがスローされ、catch ブロックでそのエラーが処理されるよ。
function divide(a, b) {
if (b === 0) {
throw new Error('Division by zero is not allowed.');
}
return a / b;
}
try {
let result = divide(10, 0);
console.log(result);
} catch (error) {
console.error('エラーが発生しました:', error.message);
}
10.4 拡張された例と利用
例 1: 複数の例外
try ブロック内で異なるタイプのエラーが発生することがあるよ。それらをエラーオブジェクトのプロパティを使って別々に処理することができるんだ。
この例では、JSONの構文エラーを他の可能性のあるエラーと区別して処理しているよ。
try {
JSON.parse('{ malformed JSON string }');
} catch (error) {
if (error instanceof SyntaxError) {
console.error('JSON 構文エラー:', error.message);
} else {
console.error('予期しないエラー:', error);
}
} finally {
console.log('パースの試みが終了しました。');
}
例 2: ネストされた try...catch ブロック
もっと細かいエラー処理のためにネストされた try...catch ブロックを使うことができるよ。
この例では、最初の try ブロック内で発生したエラーは内部の catch ブロックで処理され、 その後、そのエラーを再スローして外部の catch ブロックで処理されるんだ。
try {
try {
let result = divide(10, 0);
console.log(result);
} catch (innerError) {
console.error('内部キャッチ:', innerError.message);
throw innerError;
}
} catch (outerError) {
console.error('外部キャッチ:', outerError.message);
} finally {
console.log('ネストされた try...catch が終了しました。');
}
function divide(a, b) {
if (b === 0) {
throw new Error('ゼロで割ることは許可されていません。');
}
return a / b;
}
例 3: リソース解放のための finally の使用
finally ブロックは、ファイルのクローズやネットワーク接続の終了などのリソースを解放するのに便利だよ。
この例では、ファイルの読み込み時にエラーが発生したかどうかに関わらず、ファイルは常に閉じられるよ。
function readFile(filePath) {
let file;
try {
file = openFile(filePath); // ファイルを開く関数
// ファイルを操作
} catch (error) {
console.error('ファイルの読み込みエラー:', error.message);
} finally {
if (file) {
closeFile(file); // ファイルを閉じる関数
}
console.log('ファイル処理が終了しました。');
}
}
function openFile(path) {
// ファイルを開くロジック
}
function closeFile(file) {
// ファイルを閉じるロジック
}
readFile('path/to/file.txt');
try、catch、finally、throwを使用したJavaScriptの例外処理は、 より信頼性が高く安定したアプリケーションを作成するのに役立つんだ。これらの構造を理解して正しく使うことで、 エラーを効果的に管理し、リソースを解放し、ユーザーエクスペリエンスを向上させることができるよ。
GO TO FULL VERSION