Я играю с исключениями в 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: Не удалось исключить исключение «Исключение» с сообщением, но это не совсем похоже на мою проблему и не имеет краткого ответа.
Помоги пожалуйста?
* РЕДАКТИРОВАТЬ *
Кажется, это связано с ключевым словом throw
. Если я использую echo
например, я получил сообщение, напечатанное на экране, например:
исключение «Исключение» с сообщением «Файл не существует». в C: \ sites \ wonderfulproject \ script.php: 183 Трассировка стека: # 0 {main}
Почему это?
** ИЗМЕНИТЬ 2 **
Благодаря @Orangepill, я получил лучшее понимание того, как обрабатывать исключения. И я нашел превосходную музыку из nettuts, которая помогла много. Ссылка: http://net.tutsplus.com/tutorials/php/the-ins-and-outs-of-php-exceptions/
Это ожидаемое поведение для неперехваченного исключения с отключением 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