Убедитесь, что функция выключения PHP вызывается - PullRequest
1 голос
/ 10 мая 2011

Я пытаюсь отловить как можно больше ошибок в PHP и правильно обработать их не по умолчанию. Мой вопрос лучше всего иллюстрируется в этом примере:

<?php 

function errorHandler($errno, $errstr, $errfile, $errline){
    echo "Error handler here <br>\n";
    //throw new Exception($errstr);
}
function shutdownFunction() {
    echo "Hi I'm in here <br>\n";
}

set_error_handler("errorHandler");
register_shutdown_function("shutdownFunction");

try {
    $undefined->ok(); // causes some error
} catch(Exception $e) {
    echo "Caught the exception <br>\n";
}

Результат выполнения этого кода в виде PHP-программы будет означать, что errorHandler() запущен, напечатана ошибка PHP (если «display_errors» установлен на «On»), а затем shutdownFunction() запущен.

У меня возникает проблема, если я раскомментирую этот исключительный бросок; Я хочу, чтобы исключения PHP возникали как можно чаще. Если я раскомментирую оператор throw, то вызывается обработчик ошибок, который выдает исключение, что вызывает дальнейшую ошибку, в результате которой shutdownFunction() не вызывается.

Насколько я понимаю, я не могу превратить эту ошибку в ловкое исключение; тем не менее, я хотел бы, по крайней мере, убедиться, что функция shutdown вызывается, не ограничивая мою способность перехватывать по крайней мере некоторые php-ошибки как исключения (то есть я не хочу удалять этот оператор throw в errorHandler()).

Есть ли какая-то проверка в ErrorHandler, которую я могу сделать, чтобы проверить, не вызовет ли его сброс или нет shutdownFunction(), который будет обойден?

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Создайте исключение из обработчика ошибок, затем используйте set_exception_handler для обработки необработанных исключений.

0 голосов
/ 17 мая 2011

Таким образом, я решаю эту проблему, чтобы проверить, начинается ли параметр $ errstr с «Неопределенная переменная» - и если да, то я не выкидываю исключение.Я полагаю, если есть какие-либо другие ошибки, которые имеют подобную проблему, я сделаю то же самое с ними.Я не могу найти исчерпывающий список ошибок php и их влияние, хотя, это должно быть ad hoc

...