Menu
Coddy logo textTech

'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 ブロックは、ファイルのクローズ、リソースの解放、または操作が完了したことのログ記録などのクリーンアップ操作に最適になります。エラーハンドリングで何が起こっても、特定のコードが常に実行されることを保証できます。

challenge icon

チャレンジ

簡単

処理中にエラーが発生したかどうかに関わらず、常にクリーンアップ操作を実行するファイル処理シミュレーターを実装することで、finally ブロックの実装方法を示すプログラムを作成してください。

  1. 処理するファイル名を表す文字列入力を読み取ります
  2. ファイルの内容を表す文字列入力を読み取ります
  3. エラーをシミュレートするかどうかを表す文字列入力を読み取ります ("error" または "success")
  4. try-catch-finally 構造を使用して、ファイル処理をシミュレートします:
    • try ブロック内:エラーシミュレーションの入力が "error" であるか確認し、真の場合は "File processing failed" というメッセージを持つ例外をスローします。それ以外の場合は、ファイルを正常に処理します。
    • catch ブロック内:処理中に発生した例外を処理します。
    • finally ブロック内:成功か失敗かに関わらず、常にクリーンアップ操作を実行します。
  5. 処理結果を以下に示す正確な形式で表示します

例えば、入力が "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 ブロック内: 常にクリーンアップ操作を実行します
  
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン