Exceptions
Throw and Catch
Throwing an exception jumps to the nearest matching catch block.
controlled failure
A catch block turns a failure path into normal scalar state for the caller.
Throw and Catch
throw_catch.php
Replay: real traced execution (multi-file project)
<?php
$divisor = 2;
try {
if ($divisor === 0) {
throw new Exception("divide by zero");
}
$result = 10 / $divisor;
$status = "ok";
} catch (Exception $error) {
$result = 0;
$status = "caught";
}
echo "divisor=" . $divisor . "\n";
echo "status=" . $status . "\n";
echo "result=" . $result . "\n";
<?php
$divisor = 0;
try {
if ($divisor === 0) {
throw new Exception("divide by zero");
}
$result = 10 / $divisor;
$status = "ok";
} catch (Exception $error) {
$result = 0;
$status = "caught";
}
echo "divisor=" . $divisor . "\n";
echo "status=" . $status . "\n";
echo "result=" . $result . "\n";
<?php
$divisor = 5;
try {
if ($divisor === 0) {
throw new Exception("divide by zero");
}
$result = 10 / $divisor;
$status = "ok";
} catch (Exception $error) {
$result = 0;
$status = "caught";
}
echo "divisor=" . $divisor . "\n";
echo "status=" . $status . "\n";
echo "result=" . $result . "\n";
$divisor ← 2, $result ← 5, $status ← ok
1<?php2$divisor→ 2 = 2; //@divisor=0, 534try {5 if ($divisor === 0) {6 throw new Exception("divide by zero");7 }89 $result→ 5 = 10 / $divisor2;10 $status→ ok = "ok";11} catch (Exception $error) {12 $result = 0;13 $status = "caught";14}1516echo "divisor=" . $divisor2 . "\n";17echo "status=" . $statusok . "\n";18echo "result=" . $result5 . "\n";outputdivisor=2 status=ok result=5
$divisor ← 0
1<?php2$divisor→ 0 = 0;if ($divisor === 0)
4try {5 if ($divisor0 === 0) {6 throw new Exception("divide by zero");7 }echo "divisor=" . $divisor . " ";
11} catch (Exception $error) {12 $result = 0;13 $status = "caught";14}1516echo "divisor=" . $divisor0 . "\n";17echo "status=" . $statuscaught . "\n";18echo "result=" . $result0 . "\n";outputdivisor=0 status=caught result=0
$divisor ← 5, $result ← 2, $status ← ok
1<?php2$divisor→ 5 = 5;34try {5 if ($divisor === 0) {6 throw new Exception("divide by zero");7 }89 $result→ 2 = 10 / $divisor5;10 $status→ ok = "ok";11} catch (Exception $error) {12 $result = 0;13 $status = "caught";14}1516echo "divisor=" . $divisor5 . "\n";17echo "status=" . $statusok . "\n";18echo "result=" . $result2 . "\n";outputdivisor=5 status=ok result=2