Exceptions (Исключения) - это механизм для работы с "исключительными" ситуациями во время работы программы.
В PHP механизм исключений представлен классом Exception
, оператором throw
и блоком try ... catch ... finally
.
Класс Exception
нужен чтобы хранить данные об ошибке. Также, если программист хочет создать свой класс исключения (который будет хранить какие-то специфичные данные), то он должен будет наследовать его от класса Exception
.
Оператор throw
, как следует из названия, бросает или генериррует исключение.
throw new Exception('Error message');
После того как исключение было брошено выполнение программы приостанавливается, а само исключение начинает "подниматься" по стеку вызовов пока не встретит первый try ... catch
блок, который обрабатывает данный тип исключений, либо стек вызовов не опустеет.
В последнем случаем выполнение программы будет экстренно остановлено, а информация об ошибке, хранящяяся в исключении, выведена пользователю на экран.
Что же будет если исключение встретит try ... catch
блок. try .. catch
блок использует для обрамления потенциально опасного кода, который может бросать исключения.
function b() {
throw new Exception("I don't wanna work, i wanna throw exceptions.");
}
try {
b();
} catch (Exception $e) {
echo "b() says: " . $e->getMessage() . PHP_EOL;
}
Как видно из примера в фигурных скобках после оператора try пишется код который может бросить исключение, а в фигурных скобках после оператора catch
пишется код который выполнится только в том случае, если исключение будет пойманно. При этом тип исключения, обрабатываемый этим блоком, указывается в круглых скобках после оператора catch
. В нашем случае это стандартный класс исключений Exception
.
Также блок try ... catch
может иметь еще одну часть - finally
.
try {
...
} catch(...) {
...
} finally {
...
}
Код в блоке finally
всегда будет выполняться после кода в блоках try
и catch
, вне зависимости было ли брошено исключение или нет, перед тем как продолжится нормальное выполнение кода. Его работу можно рассмотреть на следующем примере.
function b() {
throw new Exception("Error");
}
try {
b();
} catch (Exception $e) {
echo "Catch block" . PHP_EOL;
return;
} finally {
echo "Finally block" . PHP_EOL;
}
В результате на экран выведется.
Catch block
Finally block
Лучше всего использовать исключения в ситуациях когда ошибка в одной части кода затрагивает работу других частей кода, или же код, в котором произошла ошибка, не знает как ему поступить в данной ситуации. В этих случаях он должен сгенерировать исключение, в надежде, что остальные функции / методы, из которых он был вызван смогут сами разобраться со сложившейся ситуацией. А вообще, если можно обойтись возвращаемым значением, то лучше использовать именного его.