2012-01-26 2 views
3

Я переместил файл в нашей системе в подпапку для организации, которая, в свою очередь, сломала относительный путь оператора require. Это должно было привести к предупреждению E_COMPILE_ERROR. Однако вместо этой ошибки наш пользовательский обработчик ошибок в приложении поймал ошибку как E_WARNING. Итак, наш обработчик клиента зарегистрировал сообщение, и полученный в результате экран PHP оказался пустым, как если бы был запущен die();. Вот журнал, созданный нашим местным обработчиком:PHP require statement - Сбой, но выбрасывает E_WARNING вместо E_COMPILE_ERROR

E_WARNING main(XXXXXX.php): failed to open stream: No such file or directory xxx/xxx.php Line 9 01-26-2012 09:44:27 AM 01-26-2012 10:03:24 AM

Это может быть важно отметить, что наша система все еще использует бедняга PHP 4.

Любая идея, почему требуется, должна была бы выбросить E_WARNING? Это заняло немного больше времени, чтобы понять, в чем проблема, поскольку мы не смогли увидеть сообщение об ошибке.


Редактировать: Приложение, безусловно, требовало. Пользовательский обработчик ошибок просто использует функцию set_error_handler PHP. Поэтому его не следует вызывать ничем, кроме предупреждений, уведомлений и ошибок пользователя.


Дополнительная Edit:

Может быть структура имеет что-то делать с этим? Вот как его работы: (-> средство включает в себя => означает, что требуется)

Main-> File1.php => File2.php

ли это бросить предупреждение, потому что File1.php включен, но не обязательный? Это может иметь смысл для меня, но, похоже, это сбой? Я, возможно, придется проверить это на PHP 5.


Разрешение

Я просмотрел нашего приложения и нашел это:

error_reporting (E_ERROR | E_WARNING | E_PARSE);

Поэтому E_COMPILE_ERROR не будет отображаться. Кроме того, @DaveRandom правильно говорит о том, что он бросает предупреждение, а затем бросает фатальную ошибку.

Изменение его на error_reporting (E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR); показывает сообщение об ошибке.

+0

Не видя своего пользовательского обработчика ошибок, вы не можете сказать. неудавшееся требование должно выплевывать ошибку компиляции, но поскольку вы выполняете обычную работу, убедитесь, что она фактически работает (не работает?) правильно. –

+0

убедитесь, что у вас нет знака @ в вашем требовании, который подавляет отчет об ошибках. – ncank

ответ

2

Требование выдает это предупреждение хотя бы один раз, когда вы вызываете его в файле, который не существует. Он затем испускает E_COMPILE_ERROR и умирает.

However:

следующие типы ошибок не могут быть обработаны с помощью пользовательской функции: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, и большинство из E_STRICT поднятый в файле, где set_error_handler () называется.

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

+0

Я знаю, что он не должен ловить E_COMPILE_ERROR. Тем не менее, все другие фатальные ошибки отображаются на экране, используя настройки ошибки error_reporting PHP. Возможно, мне нужно будет установить тест для этого. – teynon

+0

Я просмотрел нашу заявку и нашел следующее: error_reporting (E_ERROR | E_WARNING | E_PARSE); Поэтому E_COMPILE_ERROR не будет отображаться. Кроме того, @DaveRandom правильно говорит о том, что он бросает предупреждение, а затем бросает фатальную ошибку. – teynon

0

Действительно ли это требуется? E_WARNING, похоже, подразумевает, что вы используете include вместо того, чтобы требовать там ... или, возможно, PHP4 по-другому вел себя по этому поводу? Я честно не помню.

+0

Кажется немного похожим на * комментарий * этот * ответ * ... – DaveRandom

+0

Это определенно требуется. Я могу воссоздать проблему, добавив требование обратно. – teynon

+0

Извинения DaveRandom, я действительно опубликовал это неправильно ... – skoop

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