'finally' ブロック
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 41/65。
時には、try-catch ブロック内で何が起こっても実行されるコードが必要になることがあります。finally ブロックは、まさにこの目的のために使用されます。これには、例外が発生したかどうかに関わらず、常に実行されるコードが含まれます。
finally ブロックは、try および catch ブロックの後に記述します。try セクションでコードが正常に実行された場合でも、例外がキャッチされて処理された場合でも、finally ブロックは必ず実行されます。
try {
// 例外が発生する可能性のあるコード
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("An error occurred: $e");
} finally {
print("This always runs!");
}これにより、finally ブロックは、ファイルのクローズ、リソースの解放、または操作が完了したことのログ記録などのクリーンアップ操作に最適になります。エラーハンドリングで何が起こっても、特定のコードが常に実行されることを保証できます。
チャレンジ
簡単処理中にエラーが発生したかどうかに関わらず、常にクリーンアップ操作を実行するファイル処理シミュレーターを実装することで、finally ブロックの実装方法を示すプログラムを作成してください。
- 処理するファイル名を表す文字列入力を読み取ります
- ファイルの内容を表す文字列入力を読み取ります
- エラーをシミュレートするかどうかを表す文字列入力を読み取ります (
"error"または"success") try-catch-finally構造を使用して、ファイル処理をシミュレートします:tryブロック内:エラーシミュレーションの入力が"error"であるか確認し、真の場合は"File processing failed"というメッセージを持つ例外をスローします。それ以外の場合は、ファイルを正常に処理します。catchブロック内:処理中に発生した例外を処理します。finallyブロック内:成功か失敗かに関わらず、常にクリーンアップ操作を実行します。- 処理結果を以下に示す正確な形式で表示します
例えば、入力が "document.txt"、"Hello World"、"success" の場合、プログラムは次のように出力する必要があります:
File Processing System
======================
Opening file: document.txt
File content: Hello World
Processing file successfully...
File processed: 11 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfully入力が "report.pdf"、"Annual Report Data"、"error" の場合、プログラムは次のように出力する必要があります:
File Processing System
======================
Opening file: report.pdf
File content: Annual Report Data
Error occurred: File processing failed
Unable to complete file processing
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed with errors入力が "config.json"、"{\"setting\": \"value\"}"、"success" の場合、プログラムは次のように出力する必要があります:
File Processing System
======================
Opening file: config.json
File content: {"setting": "value"}
Processing file successfully...
File processed: 19 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfullyプログラムは try-catch-finally 構造を使用し、finally ブロックで常に3つのクリーンアップ操作を、示された通りの順序で実行する必要があります。try ブロックでは、エラーシミュレーションの入力が "error" と等しいかを確認し、真の場合は例外をスローします。エラーがシミュレートされない場合は、length プロパティを使用してファイル内容の文字数をカウントします。finally ブロックは常にクリーンアップメッセージを出力し、エラーが発生したかどうかに基づいて最終的な完了ステータスを決定する必要があります。
チートシート
finallyブロックには、例外が発生したかどうかに関わらず、try-catchの後に必ず実行されるコードが含まれます。
try {
// 例外が発生する可能性のあるコード
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("An error occurred: $e");
} finally {
print("This always runs!");
}finallyブロックは、ファイルのクローズ、リソースの解放、完了ステータスのログ記録などのクリーンアップ操作に最適です。
自分で試してみよう
import 'dart:io';
void main() {
// 入力を読み込む
String? filename = stdin.readLineSync();
String? content = stdin.readLineSync();
String? errorSimulation = stdin.readLineSync();
// システムヘッダーを表示する
print("File Processing System");
print("======================");
print("Opening file: $filename");
print("File content: $content");
// TODO: 以下にコードを記述してください
// try-catch-finally 構造を使用してファイル処理をシミュレートします
// - try ブロック内: errorSimulation が "error" と等しいか確認し、真の場合は例外をスローします
// - catch ブロック内: すべての例外を処理します
// - finally ブロック内: 常にクリーンアップ操作を実行します
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー