Эли4ка
25.08.2018 - 00:49
Добрый вечер, дорогие форумчане. Не могу понять почему. Есть пример:
function inverse($x) {
if (!$x) {
throw new Exception('Деление на ноль.');
}
return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Выброшено исключение: ', $e->getMessage(), "\n";
}
echo "Привет, мир\n";
Работает.
А если бы
echo inverse(5) . "\n";
echo inverse(0) . "\n";
Заменили на цикл while работать перестает после выброса первого исключения. Как можно это побороть?
Надеюсь понятно объяснила :rolleyes:
Ну а как должно работать? После выбрасывания исключения секция try завершается, управление переходит на catch и далее по тексту.
Вообще-то, квалифицированный программист, когда встречает блок try/catch начинает думать, что в этом месте может вылететь что-то "низкоуровневое". К тому же в твоем примере непонятно что, тогда уж создавай вменяемые исключения, например, DivisionByZeroException, чтобы людям не приходилось метаться по тексту выискивать что оттуда может прилететь. Хорошо у тебя рядышком всё, а если разнесено по файлам, да еще размазано по иерархии классов? Или через говно-фасад, тогда на твоём блоке catch может появиться вообще всё что угодно.
Исключения бросают когда в рантайме ситуацию либо не исправить вовсе, либо сложно без дичайших нагромождений (читай не целесообразно). Нам сама логика работы конструкции try/catch как бы намекает на это. =)
У тебя что, нет смысла продолжать выполнение если где-то проскочил 0? Судя по твоему вопросу нет. Зачем тогда? Делай из блока if просто return false и проверяй строгим условием на вызывающей стороне. Сравнение типов происходит моментально, они хранятся в Zval структуре отдельным мембером (полем короче) и просто оттуда вычитываются. Равно как и длина строковой переменной, массива и т.д. поэтому многие функции, используемые в условиях, отрабатывают на уровне реализации ЯП умопомрачительно быстро.
Эли4ка
25.08.2018 - 04:54
С-с-спасибо,Р-Рон.Cделаю через if