Почему продолжилось нормальное выполнение после выброса исключения?
Документация
То есть как это понимаю я: Нормальное выполнение (КОГДА ГЕНЕРИРУЕТСЯ исключения в блоках try) НЕ будет продолжено за последним блоком catch.
Смотрим пример
Откуда после Выброшено исключение: Деление на ноль, взялось Привет мир, если нормальное выполнение после catch будет продолжено, когда НЕ генерируется исключение и наоборот НЕ будет продолжено, если выброшено исключение?
DmitriyGordinskiy, нет, там написано так: Нормальное выполнение (когда не генерируются исключения в блоках try) будет продолжено за последним блоком catch.
Выполнение за последним блоком catch продолжится, когда нет исключения.
Включаем логику.
Выполнение за последним блоком catch не продолжится, когда есть исключение.
Алексей Уколов, она верна, если читать официальную документацию.
А вот, как работает:
Нормальное выполнение кода, расположенного в блоках try (когда не генерируются исключения в блоках try) будет продолжено за последним блоком catch.
Только на кой мне нужен код в блоке try, который должен быть продолжен, если нет исключения, если этот код сам не бросает исключения, что в нём будет ловить try, мне его нужно после catch выполнить, если нет исключения, но он выполнится и при исключении, потому что он не в блоке try, хотя ему там не место, он не бросает исключения. )))
«когда не генерируются исключения в блоках try» — это «когда не было выброшено исключение при этом конкретном исполнении», а не «когда код в блоке в принципе никогда не может выбросить исключение».
Я не понимаю к чему вы спорите. Как это работает вы видите сами, нас убедить в собственной правоте вы не сможете, потому что мы тоже видим, как работает на самом деле.
Можно ли было сформулировать документацию лучше? Возможно. На странице есть кнопки Edit и Report a bug — вам туда.
если исключение в принципе не бросается, к примеру, какой-нибудь echo 'Hello world';, то и ловить здесь нечего, то и в try/catch его заворачивать не нужно
Так он же выполнится всегда тогда, если ошибка, то мне не ошибку выдаст по выбросу, а выведет и ошибку и удачу, если я echo 'Ok'; не заверну в try, но ей там не место )))
like-a-boss, а что ему там делать этому сообщению, если оно не бросает исключения, что в нём ловит try? Всего лишь выполнит его, если нет исключения? Так почему бы ему не выполниться после catch, если нет исключения ...
смысл в том, что доки полностью не доносят инфу, что код ВЕСЬ нужно запихать в try
когда Есть исключение в блоке try - то выполнение продолжиться В ближайшем блоке catch. строки идущие после ошибки, в блоке try, не выполнятся
когда Нет исключения в блоке try - то выполнение продолжиться За последним блоком catch выполнятся все инструкции в блоке try и выполнение продолжиться за блоком catch
вне зависимости было или нет исключение, выполнение продолжиться после конструкции try...catch
я тоже так размышляю, но смотрите: зачем мне в try код который выполнится, если нет исключения, когда этот код сам не бросает исключения, ну там тупо echo "Ok", например, что там будет отлавливать try, я как раз вот как прочитал, то так и ожидаю выполнения: если нет выброса, то ПОСЛЕ try/catch вывести OK - это и будет соответствовать тому, что написано в документации, нет исключения - продолжаем код ПОСЛЕ catch
весь текст в одно предложение трудно читается ... давайте так:
зачем мне в try код который выполнится
в try помещается "ненадёжный" код, код который может Не выполниться. Причин, чтобы код не выполнился действительно много.
когда этот код сам не бросает исключения
уберите в функции проверку и генерацию ошибки, оставьте только: return 1/$x
я так думаю ошибку тоже словим в try блоке
если нет выброса, то ПОСЛЕ try/catch вывести OK
добавьте echo 'ok' в конец блока try {}
эта команда не исполниться, то есть сообщения "ok" не будет выведено.
так же вы можете прервать выполнение сценария, например вызвать exit() в блоке catch - тогда сценарий завершиться без продолжения выполнения После catch
в try ловим ошибку, а в catch пытаемся исправить ошибку, чтобы После try...catch у нас продолжилось Ожидаемое выполнение сценария
try {
test(); // тут бросается исключение - Ошибка
echo 'Ok'; // зачем мне тут эта дичь, если она не бросает исключения
} catch (bla-bla-bla $e) {
echo $e->getMessage(); // выводим - Ошибка
}
echo 'Ok'; // я хочу тут вывести, потому что согласно документации после последнего catch выполнится, если в блоках try нет выброса )))
как Вам такое? )))
там в доках нет указания про то, что код, который выполнится без выброса, должен быть в try )
я хочу тут вывести, потому что согласно документации после последнего catch выполнится, если в блоках try нет выброса
эм ... так нет в документации вашего этого "если", уберите его и будет поведение такое какое выполняется то что у вас выделено на скрине описывает ситуацию именно, когда Нет исключения
echo 'Ok'; // зачем мне тут эта дичь, если она не бросает исключения
вместо echo, может быть присвоение переменной, а может быть echo 1/0; - опять же, если вы уверенны, что код Выполниться без ошибки, то его можно и не писать в try блоке
ⓒⓢⓢ, я не могу не писать его, я Вывожу сообщение пользователю об удачном действии
но не вижу никакой логики помещать вывод сообщения в try, если оно не бросает исключения, хотя будет работать только так, иначе после catch оно будет выводится всегда, даже если выброшено исключение кодом, который его может выбросить
я то смысл понял, но описание не соответствует ожидаемому, там нет пометки, что код ВЕСЬ должен быть в try и не только тот, который выбрасывает, хотя что ему там делать ...
QNA-1976,
могу ещё что-нибудь такое предложить: а так получается наша дискуссия, - как интерпретатор работает и так как мы хотим, чтобы он работал, - то есть бессмысленный диалог :) (в коде могут быть ошибки, но суть передал)
$isError = true;
$a = 0;
try {
$a = test(); // тут бросается исключение - Ошибка
$isError = false;
} catch (bla-bla-bla $e) {
// Тут определяемся с ошибкой и пытаемся исправить (упрощённый вариант)
if (...) {
$a = 1;
$isError = false; // Смогли обработать ошибку
}
// Но если не смогли обработать ошибку, то у нас $isError так и останется значением true
}
if ($isError) echo 'Error';
else echo $a;
ⓒⓢⓢ, спс, что время потратили, но описание не полное документации и логика работы try/catch оставляет так сказать желать
public function signinAction()
{
if ($this->checkForm('signin')) {
try {
$this->model->signinHandler();
$this->alertMessage('success', 'Добро пожаловать'); // нечего тут делать по идее
$this->redirectToPage('/menu'); // нечего тут делать по идее
} catch (DomainException $domainException) {
$this->alertMessage('danger', $domainException->getMessage());
}
}
$this->pageDescription('Вход');
}
Александр, Только если $this->model->signinHandler(); убрать, то конструкция try/catch становится бессмысленной, что try/catch будет делать с остальными методами? ;)
А что должно было произойти, заруиниться сценарий? Если бы это работало таким образом, весь интернет был бы ошибка на ошибке.
try/catch для того и нужны, чтобы отлавливать исключения и не заруинить последующее исполнение сценария. Вот если бы там не было try/catch, не произошло бы приветствия с миром.
QNA-1976, не правильно. Как это не должен, если он выполняется, а значит должен. Мы поймали брошенное исключение и обработали, а значит дальше продолжится НОРМАЛЬНОЕ выполнение сценария.
Ещё раз: если бы вызов не был обёрнут в попытаться(даже само название говорит, что мы пытаемся, так как не уверены, что код отработает безошибочно, а в кетч мы обрабатываем ошибку, которая туда приходит), тогда бы просто было брошено исключение и сценарий бы прекратился не дойдя до «привет мир».
В документации нормальное исполнение трактуется, как исполнение при котором интерпретатором не будет брошено исключение.
like-a-boss, там не написано, что код будет выполнен после того, как поймали там что-то, там написано, что нормальное выполнение после catch будет продолжено, если НЕ выброшено исключение.
В примере выброшено исключение и после catch продолжено выполнение )))
QNA-1976, но мы ПОЙМАЛИ(в блоке catch) это исключение, а значит всё хорошо, жизнь прекрасна.
Если непонятно php’шное изложение, посмотрите документацию к другим языкам, к примеру try/catch в JavaScript или python(try/except), везде это работает одинаково.
А лучше: забейте на документацию и просто попишите код и посмотрите, как он себя ведёт, ни одна документация не заменит опыт.