Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
4+E1
throw new Exception("E1") это исключение считается отловленным, раз есть блок finally. finally в том, что он выполняется в любом случае, было ли выброшено исключение или нет. Исключения он не обрабатывает!try выполняется до места выброса исключения E1, то есть, до строки 4 в примере. Выводится «1».E1 и далее оно ловится в блоке catch, если таковой присутствует. В данном случае блока catch нет, поэтому исключение пробрасывается выше. Однако, есть блок finally, который выполняется в любом случае.finally содержится свой блок с try...catch, он и начинает выполняться. Внутри блока try на строке 7 выводится «2», затем на строке 8 бросается исключение E2 (это уже второе по счёту исключение, предыдущее выброшенное исключение ещё никто не обработал!), которое тут же ловится соответствующим блоком catch на строке 9, в котором выводится «3» (на строке 10). До строчки с выводом «4-» (строка 13) управление не дойдёт никогда.E1, выброшенное на строке 4. Поскольку вся эта конструкция с блоком try...finally завёрнута ещё в один блок try...catch, ловящий исключения нужного типа, исключение должно быть поймано на строке 14 и обработано на строке 15. В результате вывод дополнится «4+E1».E1 просто забывается, соответственно, внешний блок try...catch его не ловит.Исключения он не обрабатывает!
try{
...
} finally {
..
}
try{
...
} catch(Exception$e) {
//do nothing
} finally {
..
}
В данном случае блока catch нет, поэтому исключение пробрасывается выше
catch, то исключение не перехватывается, не обрабатывается и, разумеется, будет ошибка (не перехваченного исключения). Или вы о какой-то другой ошибке? И почему вы решили, что?try{ ... } finally { .. }
это просто сокращенная запись
try{ ... } catch(Exception$e) { //do nothing } finally { .. }
try {
try {
echo "1\n";
throw new Exception("E1");
} catch (Exception $e) {
throw $e;
} finally {
try {
echo "2\n";
throw new Exception("E2");
} catch (\Exception $e) {
echo "3\n";
}
}
echo "4-\n";
} catch (\Exception $e) {
echo "4+".$e->getMessage()."\n";
}
echo "5\n";
Опасный finally или ждем 5.6