Я пытаюсь запустить этот пример №1 с этой страницы: http://php.net/manual/en/language.exceptions.php
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>
Однако вместо желаемого результата я получаю:
0.2
Fatal error: Uncaught exception 'Exception' with message 'Division by zero.'
in xxx:
7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7
Я использую среду разработчика UniServer 3.5
сPHP 5.2.3
Ответы:
У меня была именно эта проблема, когда казалось, что я даже скопировал имя исключения, но оно не уловило его. Оказалось, что это была моя глупая ошибка, но я подумал, что должен опубликовать свое дело здесь на случай, если кто-то еще окажется в такой же ситуации.
У меня был исключение в моем пространстве имен и сценарий был в пространстве имен B . Проблема заключалась в том, что у меня было A \ MyException, которое равно (в PHP) \ B \ A \ MyException (потому что мой скрипт находится в пространстве имен с именем B !). Все, что мне нужно было сделать, чтобы исправить это, - это добавить обратную косую черту (или как там она называется) к имени исключения, чтобы оно выглядело так: \ A \ MyException
источник
catch (\Exception $e)
. Без обратной косой чертыException
специфичен для пространства имен и не будет сопоставлен (или пойман).Довольно старый вопрос, но ...
У меня тоже была эта проблема (и именно так я нашел этот пост), но простой эксперимент позволил мне найти решение. Просто попробуйте сменить
Exception
на\Exception
. Сработало у меня!РЕДАКТИРОВАТЬ:
Как указал Сиванн в комментариях, использование пространства имен должно делать то же самое. Поэтому просто поставьте
use \Exception as Exception;
перед объявлением класса.источник
use Exception;
должен это сделатьПопробуйте поставить
catch(\Exception $e)
вместоcatch(Exception $e)
. Если вы используете код, о котором не очень хорошо знаете, или - особенно - если вы используете фреймворк, он может переопределить исключение PHP по умолчанию одним своим собственным, и поэтому вы можете пойти по неправильному пути и получить нежелательный результат. Если вы просто поставили\Exception
, то вы точно поймаете базовое исключение PHP.источник
Вы не можете использовать типичные блоки try {} catch {} в PHP, как вы могли бы это сделать на другом языке, таком как C # (Csharp).
Если вы сделаете это:
Вы не увидите "Понятно!" сообщение никогда. Зачем? Просто потому, что PHP всегда нужно «выбросить» исключение. Вам нужно установить собственный обработчик ошибок и выбросить с ним исключение.
См. Функцию set_error_handler : http://php.net/manual/es/function.set-error-handler.php
источник
$number = 5/0;
исключение не возникает.$number
установлено бытьINF
.Я начну с того, что у вас есть опечатка в имени исключения, которое вы перехватываете / бросаете, но если ваш код точно такой же, я не совсем уверен, что происходит.
Попробуйте следующую модификацию исходного сценария и вставьте свои результаты. Это поможет лучше диагностировать вашу проблему.
источник
У меня была такая же проблема со следующими конфигурациями,
PHP 5.2.14 (cli) (построено: 12 августа 2010 г., 17:32:30) Copyright (c) 1997-2010 PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies с eAccelerator v0.9.5. 1 , Copyright (c) 2004-2006 eAccelerator, автор: eAccelerator
Решение состоит в том, чтобы либо отключить eAccelerator, либо обновить его. Я попробовал оба, и оба исправления сработали. Об ошибке сообщается здесь https://eaccelerator.net/ticket/242 (NB. Firefox жалуется на свой сертификат SSL).
Теперь я выполняю попытку правильно поймать со следующими конфигурациями,
PHP 5.2.4 (cli) (построено: 16 октября 2007 г., 09:13:35) Copyright (c) 1997-2007 PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies с eAccelerator v0.9.6. 1 , Copyright (c) 2004-2010 eAccelerator, автор: eAccelerator
источник
\ Exception у меня не работает, но я нашел решение.
Мне нужно было заменить try {} catch (Exception $ e) {} на try {} catch (Throwable $ e) {}.
Для получения дополнительной информации: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
источник
в Xdebug есть настройка:
Это заставит php выводить исключения даже в блоке try catch. Превратите это в
0
источник
Если вы используете PHP 7, вам может понадобиться Throwable вместо Exception
источник
Может быть, попробуйте отключить определенные сторонние расширения, которые вы могли установить? http://bugs.php.net/bug.php?id=41744
источник
TL; DR; убедитесь, что у вас есть
use Exception;
поверх обоих файлов phpисточник
Я тоже это переживаю. Я прочитал комментарий от Rowinson Gallego, в котором должно быть выбрано состояние Exception. Поэтому я изменил свой код с:
в:
Оно работает.
источник