Неустранимая ошибка PHP: необработанное исключение "Исключение"
Я играю с исключениями в PHP. Например, у меня есть скрипт, который читает запрос $_GET и загружает файл; Если файл не существует, должно появиться новое исключение:
if ( file_exists( $_SERVER['DOCUMENT_ROOT'] .'/'.$_GET['image'] ) ) {
// Something real amazing happens here.
}
else {
throw new Exception("The requested file does not exists.");
}
Проблема в том, что, когда я пытаюсь предоставить несуществующий файл для теста, я получаю ошибку 500 вместо сообщения об исключении. Журнал сервера выглядит следующим образом:
[09-Jul-2013 18:26:16 UTC] PHP Fatal error: Uncaught exception 'Exception' with message 'The requested file does not exists.' in C:\sites\wonderfulproject\script.php:40
Stack trace:
#0 {main}
thrown in C:\sites\wonderfulproject\script.php on line 40
Интересно, я здесь что-то упускаю, что-то действительно очевидное
Я проверил этот вопрос Фатальная ошибка PHP: Uncaught исключение "Исключение" с сообщением, но это не совсем похоже на мою проблему, и не имеют краткого ответа.
Помогите, пожалуйста?
* РЕДАКТИРОВАТЬ *
Кажется, это связано с throw
ключевое слово. Если я использую echo
например, я получил сообщение, напечатанное на экране, например:
исключение "Исключение" с сообщением "Файл не существует". в C:\sites\wonderfulproject\script.php:183 Трассировка стека: #0 {main}
Это почему?
** РЕДАКТИРОВАТЬ 2 **
Благодаря @Orangepill я лучше понял, как обрабатывать исключения. И я нашла превосходную цитату из неттута, которая очень помогла. Ссылка: http://net.tutsplus.com/tutorials/php/the-ins-and-outs-of-php-exceptions/
3 ответа
Это ожидаемое поведение для необработанного исключения с отключенным display_errors.
Здесь вы можете включить display_errors через php или ini-файл или перехватить и вывести исключение.
ini_set("display_errors", 1);
или же
try{
// code that may throw an exception
} catch(Exception $e){
echo $e->getMessage();
}
Если вы выбрасываете исключения, значит, что где-то дальше, что-то будет ловить и справляться с этим. Если нет, то это ошибка сервера (500).
Другой вариант для вас - использовать set_exception_handler для установки обработчика ошибок по умолчанию для вашего скрипта.
function default_exception_handler(Exception $e){
// show something to the user letting them know we fell down
echo "<h2>Something Bad Happened</h2>";
echo "<p>We fill find the person responsible and have them shot</p>";
// do some logging for the exception and call the kill_programmer function.
}
set_exception_handler("default_exception_handler");
Просто добавьте сюда немного дополнительной информации на случай, если у кого-то возникнет та же проблема, что и у меня.
Я использую пространства имен в своем коде, и у меня был класс с функцией, которая выдает исключение.
Однако мой код try/catch в другом файле класса был полностью проигнорирован, и была выдана обычная ошибка PHP для неотслеживаемого исключения.
Оказалось, я забыл добавить "use \Exception;" наверху, добавив, что решил ошибку.
За
throw new Exception('test exception');
Я получил 500 (но ничего не увидел в браузере), пока не поставлю
php_flag display_errors on
в моем.htaccess (только для подпапки). Также есть более подробные настройки, см. Включение отображения ошибок в php только через htaccess.