Исключения в php, по способу своей работы, очень похожи на исключения в других языках программирования, но существует одно большое отличие из за которого многие новички не понимают как с ними работать. Прежде чем разберемся с особенностями обработки исключений в php давайте разберемся что же вообще такое — эти исключения.
Исключения — это класс который принимает в себя определенные свойства и используется для надежности и стабильности кода. Для работы с исключениями используется 4 конструкции:
- try { //код }
- catch { //код}
- throw new Exeption(‘//строковый параметр’)
- finally {//код}
Конструкция try
Данная конструкция служит для выполнения кода в котором может возникнуть исключение и может использоваться только в связку с конструкциями catch() или/и finally. В случае возникновения исключения выполнения кода в блоке try останавливается и перебрасывается в блок catch{}(если такой есть) или finally{} (если блока catch нет).
Конструкция catch
Блок catch{} служит для перехвата исключения которое возникает в соответствующем блоке try{}. В качестве аргумента принимает класс исключения. Для одного блока try может быть несколько блоков catch для разных классов исключения.
Конструкция throw
Генерирует новый класс исключения и вызывает его, перебрасывая из код try в catch
Конструкция finally
Из название понятно, что это последний по приоритету блок, выполнения кода в конструкции, перехвата исключений. Выполняется после блока catch() если таковой имеется или после блока try. Данный блок доступен с версии PHP 5.5 и выше
Рассмотрим на примере всю связку
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$b = 5;
$c = 1;
try
{
if($b > 2)
{
throw new Exception(‘Значение больше двух’);
$c = 2;
}
}
catch(Exception $e)
{
echo $e->getMessage();
}
|
В блоке try мы проверяем значение переменной $b и если оно больше 2 то генерируем исключение с сообщением ‘Значения больше двух’, в итоге выполнения кода переходит в блок catch. Можете убедиться в этом проверив значение переменной $c — оно будет равно 1.
Но в чем же отличие исключений php от исключений в других языках спросите вы? А в том что по умолчанию ошибки не генерируют класс исключений и от конструкции try catch не будет ни какого толку. Изменим наш предыдущий код и в конструкции try попробуем обратиться к не существующему ключу массива:
1
2
3
4
5
6
7
|
try
{
if($b > 2)
{
echo $b[‘key’];
}
}
|
В результате выполнения данного примера блок catch не будет вызван, а на экране мы увидим warning(предупреждение) о том что данный ключ массива не существует. То же самое будет при других ошибках php: notice, fatal error. Для того что бы вызвать исключение при любых ошибках нужно воспользоваться функцией set_error_handler(), которая в качестве аргумента принимает пользовательскую функцию, в которой мы должны вызвать исключение. Рассмотрим на примере:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$c = 5;
try
{
if($b > 2)
{
set_error_handler(«exception_error_handler»);
$c[‘qwe’] = 10;
}
}
catch(ErrorException $e)
{
echo $e->getMessage();
}
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
|
Перед обращением к массиву мы задаем обработчик ошибок с помощью функции set_error_handler, которая вызывает функцию exception_error_handler с параметрами ошибки, а та в свою очередь генерирует класс исключения ErrorExeption, которое мы перехватываем в блоке catch(). Название класса исключения и название пользовательской функции может быть любым.