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

divisor
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";
  1. $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
  1. $divisor ← 0

    1<?php2$divisor→ 0 = 0;
  2. if ($divisor === 0)

    4try {5    if ($divisor0 === 0) {6        throw new Exception("divide by zero");7    }
  3. 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
  1. $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