Неустранимая ошибка 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.

Другие вопросы по тегам