'finally' ブロック
CoddyのPHPジャーニー「論理とフロー」セクションの一部 — レッスン 54/68。
例外が発生したかどうかに関わらず実行されるコードが必要な場合があります。finally ブロックはこの保証を提供します。これには try...catch ブロックの完了後に必ず実行されるコードが含まれており、ファイルのクローズやデータベース接続などのクリーンアップ操作に最適です。
finallyブロックは、tryブロックが例外なく成功した場合、例外がスローされてキャッチされた場合、さらには例外がスローされたがキャッチされなかった場合など、あらゆるシナリオで実行されます。この信頼性により、重要なクリーンアップコードが常に実行されることを保証するために非常に貴重なものとなっています。
<?php
try {
echo "Attempting operation...\n";
// 例外をスローする可能性のあるコード
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup completed.\n";
}
?>finally ブロックは、try ブロックと catch ブロックの両方が終了した後に実行され、不可欠なクリーンアップコードを記述するための一貫した場所を提供します。これにより、実行中に何が起こったとしても、スクリプトがリソースを適切に処理し、クリーンな状態を維持できるようになります。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単2つの入力(演算の種類と数値)を受け取ります。最初の入力は "divide" または "multiply" のいずれかの文字列です。2番目の入力は、演算に使用される数値です。
両方の入力を読み取り、try...catch...finally ブロックを作成してください。try ブロックの中で、演算の種類を確認します。
- 演算が
"divide"の場合、数値がゼロかどうかを確認してください。もしゼロであれば、メッセージ"Cannot divide by zero"を持つ新しいExceptionをスローしてください。数値がゼロでない場合は、100をその数値で割った値を計算し、"Result: "に続けてその結果を出力してください。 - 演算が
"multiply"の場合、100にその数値を掛けた値を計算し、"Result: "に続けてその結果を出力してください。
catch ブロックでは、getMessage() メソッドを使用して、"Error: " に続けて例外メッセージを出力することで、あらゆる例外を処理してください。
finally ブロックでは、"Operation completed" と出力してください。
入力形式:
- 1行目: 演算の種類の文字列(
divideまたはmultiply) - 2行目: 数値(例:
5、0、2.5)
期待される出力:
- 演算が成功した場合:
Result:に続いて計算された値、その後の新しい行にOperation completed - ゼロによる除算が発生した場合:
Error: Cannot divide by zero、その後の新しい行にOperation completed
チートシート
finally ブロックには、例外が発生したかどうかに関わらず、try...catch ブロックの完了後に常に実行されるコードが含まれます。ファイルのクローズやデータベース接続などのクリーンアップ操作に最適です。
finally ブロックは、あらゆるシナリオで実行されます:
tryブロックが例外なく成功したとき- 例外がスローされ、キャッチされたとき
- 例外がスローされたが、キャッチされなかったとき
<?php
try {
echo "Attempting operation...\n";
// 例外をスローする可能性のあるコード
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup completed.\n";
}
?>finally ブロックは、try ブロックと catch ブロックの両方が終了した後に実行され、不可欠なクリーンアップコードが常に実行されることを保証します。
自分で試してみよう
<?php
// 入力を読み込む
$operation = trim(fgets(STDIN));
$number = floatval(fgets(STDIN));
// TODO: 以下にコードを記述してください
// 操作を処理するために try...catch...finally ブロックを作成します
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。