[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Исключения в цикле
Эли4ка
Добрый вечер, дорогие форумчане. Не могу понять почему. Есть пример:
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:
Ron
Ну а как должно работать? После выбрасывания исключения секция try завершается, управление переходит на catch и далее по тексту.

Вообще-то, квалифицированный программист, когда встречает блок try/catch начинает думать, что в этом месте может вылететь что-то "низкоуровневое". К тому же в твоем примере непонятно что, тогда уж создавай вменяемые исключения, например, DivisionByZeroException, чтобы людям не приходилось метаться по тексту выискивать что оттуда может прилететь. Хорошо у тебя рядышком всё, а если разнесено по файлам, да еще размазано по иерархии классов? Или через говно-фасад, тогда на твоём блоке catch может появиться вообще всё что угодно.

Исключения бросают когда в рантайме ситуацию либо не исправить вовсе, либо сложно без дичайших нагромождений (читай не целесообразно). Нам сама логика работы конструкции try/catch как бы намекает на это. =)

У тебя что, нет смысла продолжать выполнение если где-то проскочил 0? Судя по твоему вопросу нет. Зачем тогда? Делай из блока if просто return false и проверяй строгим условием на вызывающей стороне. Сравнение типов происходит моментально, они хранятся в Zval структуре отдельным мембером (полем короче) и просто оттуда вычитываются. Равно как и длина строковой переменной, массива и т.д. поэтому многие функции, используемые в условиях, отрабатывают на уровне реализации ЯП умопомрачительно быстро.

Эли4ка
blink.gif
С-с-спасибо,Р-Рон.Cделаю через if
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.