Можно ли игнорировать фатальную ошибку в PHP? - PullRequest
2 голосов
/ 18 декабря 2009

Я понимаю значение термина «фатальная ошибка», но я хочу написать такой тестовый класс (отвратительно упрощенный):

class tester {

    function execute() {

        if( @$this->tryit() === true ) return true;
        return false;

    }

    function tryit() {

        $doesntexist = new noobject();
        return true;

    }

}

на самом деле у меня был бы Test родительский класс, и тогда классы расширяли бы его и содержали кучу методов с кучей тестов. Родительский класс будет определять execute, и он будет просто запускать каждый метод в дочернем классе (конечно, за исключением execute) и собирать данные о том, какие функции проходят, а какие - нет.

Я хочу написать тесты до того, как я на самом деле напишу часть своего кода, но вместо использования assert я просто хочу запускать каждый тест и генерировать список функций, классы которых не пройдены. Но это означает, что если тест не пройден, это означает, что произошла ошибка - но я также хочу обрабатывать случаи, когда я забыл определить класс и т. Д. Можно ли это сделать, не умирая весь сценарий?

Я думал, что сценарий просто завершится неудачей до вызова функции с @ перед ним, а затем продолжится, но, очевидно, я ошибся. Есть ли обходной путь?

Ответы [ 4 ]

7 голосов
/ 18 декабря 2009

Неустранимая ошибка Неустранимая , и с этим ничего не поделаешь.

Две идеи решений могут быть:

  • Чтобы проверить, существует ли метод, прежде чем пытаться вызвать его; см method_exists
  • Или, чтобы выполнить каждый «тест» в отдельном процессе: таким образом, если есть фатальная ошибка, вызванная одним тестом, умирает только «дочерний» процесс, соответствующий этому тесту, а «родительский» процесс тестовый пусковой механизм, может обнаружить это и считать его неудачным.

На самом деле, второе решение существует в PHPUnit , начиная с версии 3.4, если я правильно помню; -)

2 голосов
/ 14 февраля 2012

Да и Нет

Вы не можете написать это так, чтобы код начинал с того места, где он остановился, после фатального. Однако вы можете использовать register_shutdown_function (), чтобы продолжить обработку php после фатальной ошибки.

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

register_shutdown_function отлично подходит для перенаправления пользователя на страницу с ошибкой 500 с формой контакта, предварительно оцененной с информацией об ошибке. Таким образом, пользователи могли бы помочь мне, открыв проблему на моем github acct.

2 голосов
/ 18 декабря 2009

Неустранимые ошибки не могут быть остановлены, даже с set_error_handler. Тем не менее, вы часто можете найти другой путь за счет написания большего количества кода. Для примера метода tryit вы можете написать функцию autoload , которая вызывает нефатальную ошибку или (в PHP 5.3.0) выдает исключение, или использовать class_exists пропустить создание экземпляра несуществующего класса.

1 голос
/ 18 декабря 2009

Полагаю, вы бы настроили обработчик ошибок с помощью функции set_error_handler(), которая вызывает ваш класс тестирования, чтобы сообщить об ошибке, но я не совсем уверен, как именно вы ее реализуете.

...