Exceptions

Throwing errors

Sometimes things go wrong when someone uses your code. How do we handle this situation? PHP has Exceptions to define errors and the ability to throw them to stop code execution and tell the user of your code that something is wrong.

<?php

class Processor
{
    public function charge($creditCard)
    {
        if (strlen($creditCard->getNumber()) !== 16) {
            throw new Exception('Credit card is not right');
        }
    }
}

In this case, if someone tried to use the Processor class to charge a credit card number that is not 16 characters long, an Exception will be thrown which stops the rest of the code from running.

$processor = new Processor();
$processor->charge('1234');

A developer who wants to prevent an exception from stopping code execution can catch the exception and use it for logging or display the error to a user.

Just wrap the code that might throw an exception with the keyword try and braces followed by catch, the exception type in parentheses and more braces.

try {
    $processor->charge('1234');
} catch (Exception $e) {
    echo $e->getMessage() . "\n";
}

You can make your own custom exceptions as well. They are just classes that extend the Exception class.

class MyCustomException extends Exception {}

Then, you can try to catch your exception instead of the base exception.

try {
    throw new MyCustomException('I am a custom exception');
} catch (MyCustomException $e) {
    echo "Caught MyCustomException\n";
}

Since all exceptions inherit from Exception, catching Exception will catch any and all exceptions that might be thrown.

try {
    throw new MyCustomException('I inherit from Exception');
} catch (Exception $e) {
    echo "Still caught MyCustomException\n";
}

You can also create multiple catch blocks to handle different types of exceptions in one try-catch.

try {
    throw new MyCustomException('I am being thrown again');
} catch (MyCustomException $e) {
    echo "MyCustomException was caught\n";
} catch (Exception $e) {
    echo "Just in case a different exception is thrown\n";
}