2013-07-09 3 views
7

Я играю с исключениями в PHP. Например, у меня есть скрипт, который читает запрос $ _GET и загружает файл; Если файл не существует, новое исключение должно быть брошено:PHP Неустранимая ошибка: исключение «исключение»

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 fatal error: Uncaught exception 'Exception' with message, но это не совсем так, как моя проблема, и не имеют краткого ответа.

Помогите, пожалуйста?

* EDIT *

Это кажется, что это что-то связанное с throw ключевым словом. Например, если я использую echo, я получил сообщение, напечатанное на экране, например:

Исключение «Исключение» с сообщением «Файл не существует». в C: \ sites \ wonderfulproject \ script.php: 183 Трассировка стека: # 0 {main}

Почему это?

** EDIT 2 **

Благодаря @Orangepill, я получил лучшее представление о том, как обрабатывать исключения. И я нашел превосходную музыку из nettuts, которая помогла много. Ссылка: http://net.tutsplus.com/tutorials/php/the-ins-and-outs-of-php-exceptions/

+3

Ваш журнал сообщает вам, что именно вы хотите, чтобы сказать, в чем проблема? –

+1

'file_exists', очевидно, возвратил' false', вероятно, потому что файл действительно * не * существует. – deceze

+0

@DanyCaissy Проблема в том, что я получаю 500-Internal Server Error, вместо исключения с моим сообщением и трассировкой стека на экране. – darksoulsong

ответ

20

Это ожидаемое поведение для неперехваченного исключения с отключением 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"); 
+0

Ницца. Но я думал, что могу бросить исключения за пределами блока catch try, поправьте меня, если я ошибаюсь, пожалуйста. Я обновил свой вопрос с новым описанием того, что я пробовал. – darksoulsong

+0

вы можете ... но вы получите сообщение 500 серверов:) .... Нет смысла бросать исключение, кроме как дать себе возможность поймать и обработать его или, по крайней мере, форматировать информативные «oops», страницы для конечного пользователя, если исключение не может быть восстановлено. – Orangepill

+0

Попробуйте/поймать не нужно в функции, которая выдает исключение, она также может быть еще ниже в стеке выполнения ... как в вызывающей стороне этой функции, так и в функции вызывающего. – Orangepill

7

Просто добавьте немного дополнительной информации здесь, если у кого-то есть такая же проблема, как и я.

Я использую пространства имен в своем коде, и у меня был класс с функцией, которая генерирует исключение.

Однако мой код try/catch в другом файле класса был полностью проигнорирован, и была вызвана обычная ошибка PHP для исключенного исключения.

Оказалось, что я забыл добавить «use \ Exception;» вверху, добавив, что разрешила ошибку.

+1

Или вы можете определить путь в вызове класса: throw new \ Exception (...); Обратите внимание на ведущее «\», чтобы определить путь к классу в корне. – DeeZone

+0

Спасибо @xorinzor за решение моей проблемы! Я собирался сойти с ума ... – Joe

0

Для

throw new Exception('test exception'); 

я получил 500 (но ничего не видел в браузере), пока я не положил

php_flag display_errors on 

в моей .htaccess (только для подпапок). Есть также более подробные настройки, см. Enabling error display in php via htaccess only

Смежные вопросы