Справочник на езика
PHP Manual

Изключения

Съдържание

PHP 5 има модел за изключения подобен на този в други езици за програмиране. Изключенията могат да бъдат хвърляни (throw) и хващани (catch) в PHP. Кодът може да бъде обграден от блок try (изпробвам), за да се улесни прихващането на потенциални изключения. Всеки try трябва да има поне един съответстващ блок catch. Многобройни блокове catch могат да бъдат използвани за прихващане на различни класове от изключения. Нормалното изпълнение (когато няма хвърлено изключение в блока try или когато catch, съвпадащ с класа на хвърленото изключение, не е наличен) ще продължи след последния прихващащ блок, дефиниран в поредицата. Изключенията могат да бъдат хвърляни (throw) (или повторно хвърляни) в рамките на даден блок catch.

Когато някое изключение бива хвърлено, кодът след инструкцията няма да бъде изпълнен и PHP ще опита да намери първия съвпадащ хващащ блок (catch). Ако изключението не бъде прихванато, в PHP ще бъде изведена фатална грешка (Fatal Error) със съобщение за "Неприхванато изключение (Uncaught Exception) ...", освен ако не е бил дефиниран обработчик посредством set_exception_handler().

Забележка: Вътрешните функции на PHP използват предимно докладване на грешки, само новите обектно-ориентирани разширения ползват изключения. Все пак, грешките лесно могат да бъдат преобразувани в изключения с помощта на ErrorException.

Съвет

Стандартизираната библиотека на PHP (SPL) предоставя полезен набор от вградени изключения.

Example #1 Хвърляне на изключения

<?php
function inverse($x) {
    if (!
$x) {
        throw new 
Exception('Деление на нула.');
    }
    else return 
1/$x;
}

try {
    echo 
inverse(5) . "\n";
    echo 
inverse(0) . "\n";
} catch (
Exception $e) {
    echo 
'Прихванато изключение: ',  $e->getMessage(), "\n";
}

// Изпълнението продължава
echo 'Здравей свят';
?>

Примерът по-горе ще изведе:

0.2
Прихванато изключение: Деление на нула.
Здравей свят

Example #2 Вложени изключения

<?php

class MyException extends Exception { }

class 
Test {
    public function 
testing() {
        try {
            try {
                throw new 
MyException('foo!');
            } catch (
MyException $e) {
                
/* хвърли го повторно */
                
throw $e;
            }
        } catch (
Exception $e) {
            
var_dump($e->getMessage());
        }
    }
}

$foo = new Test;
$foo->testing();

?>

Примерът по-горе ще изведе:

string(4) "foo!"

Справочник на езика
PHP Manual