Exception
The base class for all exceptions in PHP is Exception. It is used when something goes wrong in the code that should be handled gracefully.
try {
throw new Exception("Something went wrong!");
} catch (Exception $e) {
echo "Caught exception: " . $e->getMessage();
}
// Caught exception: Something went wrong!
ErrorException
An ErrorException is thrown when a standard PHP error (like a warning or notice) is converted into an exception. You can set this behavior using set_error_handler().
function errorToException($severity, $message, $file, $line) {
throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler("errorToException");
try {
echo $undefinedVar;
} catch (ErrorException $e) {
echo "ErrorException caught: " . $e->getMessage();
}
// ErrorException caught: Undefined variable $undefinedVar
ClosedGeneratorException
Thrown when you attempt to interact with a closed generator.
function gen() {
yield 1;
}
$generator = gen();
$generator->next();
$generator->next(); // generator closes
try {
$generator->send("value"); // invalid on closed generator
} catch (ClosedGeneratorException $e) {
echo "Caught ClosedGeneratorException: " . $e->getMessage();
}
Error
Error is the base class for all internal PHP errors. Unlike Exception, it represents fatal issues in code execution.
try {
nonExistingFunction();
} catch (Error $e) {
echo "Caught Error: " . $e->getMessage();
}
// Caught Error: Call to undefined function nonExistingFunction()
ArgumentCountError
Thrown when a function is called with too few or too many arguments.
function greet($name) {
return "Hello, $name!";
}
try {
echo greet(); // missing argument
} catch (ArgumentCountError $e) {
echo "Caught ArgumentCountError: " . $e->getMessage();
}
// Caught ArgumentCountError: Too few arguments to function greet(), 0 passed
ArithmeticError
Occurs when an invalid arithmetic operation happens.
try {
$result = intdiv(PHP_INT_MIN, -1); // invalid integer division
} catch (ArithmeticError $e) {
echo "Caught ArithmeticError: " . $e->getMessage();
}
// Caught ArithmeticError: Division of PHP_INT_MIN by -1 is not an integer
AssertionError
Thrown when an assertion fails (if assertions are enabled).
ini_set('assert.exception', 1);
try {
assert(false, "Assertion failed!");
} catch (AssertionError $e) {
echo "Caught AssertionError: " . $e->getMessage();
}
// Caught AssertionError: Assertion failed!
DivisionByZeroError
Thrown when dividing an integer by zero.
try {
$x = intdiv(10, 0);
} catch (DivisionByZeroError $e) {
echo "Caught DivisionByZeroError: " . $e->getMessage();
}
// Caught DivisionByZeroError: Division by zero
CompileError
Occurs when the PHP engine encounters a compile-time error. These are rare and usually unrecoverable.
try {
eval('function test( {'); // invalid syntax at compile time
} catch (CompileError $e) {
echo "Caught CompileError: " . $e->getMessage();
}
// Caught CompileError: syntax error, unexpected token "{", expecting variable
ParseError
Thrown when eval() encounters a parsing error.
try {
eval('echo "Missing semicolon"'); // syntax error
} catch (ParseError $e) {
echo "Caught ParseError: " . $e->getMessage();
}
// Caught ParseError: syntax error, unexpected end of file, expecting "," or ";"
TypeError
Thrown when an argument or return value does not match a type declaration.
function square(int $x): int {
return $x * $x;
}
try {
echo square("hello"); // wrong type
} catch (TypeError $e) {
echo "Caught TypeError: " . $e->getMessage();
}
// Caught TypeError: square(): Argument #1 ($x) must be of type int, string given
ValueError
Introduced in PHP 8, thrown when a function receives an argument of the correct type but with an invalid value.
try {
$str = substr("hello", -10, -5); // invalid value
} catch (ValueError $e) {
echo "Caught ValueError: " . $e->getMessage();
}
UnhandledMatchError
Thrown when a match expression does not handle all possible values.
try {
$x = 5;
$result = match ($x) {
1 => "One",
2 => "Two",
};
} catch (UnhandledMatchError $e) {
echo "Caught UnhandledMatchError: " . $e->getMessage();
}
// Caught UnhandledMatchError: Unhandled match case 5
FiberError
Introduced in PHP 8.1, this occurs when there's invalid use of Fibers (lightweight concurrency).
$fiber = new Fiber(function () {
return "Hello from Fiber!";
});
try {
$fiber->resume();
$fiber->resume(); // invalid, already finished
} catch (FiberError $e) {
echo "Caught FiberError: " . $e->getMessage();
}
// Caught FiberError: Cannot resume a fiber that is not suspended
RequestParseBodyException
Thrown in request_parse_body() when the request body is invalid, according to the Content-Type header.
try {
throw new RequestParseBodyException("Invalid JSON body");
} catch (RequestParseBodyException $e) {
echo "Caught RequestParseBodyException: " . $e->getMessage();
}
// Caught RequestParseBodyException: Invalid JSON body
Source: Orkhan Alishov's notes