Могу ли я отключить обработку ошибок/исключений в Silex?

Я создаю приложение на основе Silex 1.3. Это мое первое знакомство с Silex, поэтому я не очень хорошо с ним знаком.

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

Однако, как только я окажусь внутри контроллера Silex, промежуточного программного обеспечения и т. д., Silex возьмет на себя управление и будет использовать собственную обработку ошибок. Мой по-прежнему будет ловить фатальные ошибки, поскольку Silex, по-видимому, не подключается к выключению, но все остальное заменяется страницей «Что-то пошло не так» по умолчанию от Silex.

Я понимаю, что я могу использовать $app->error(), чтобы переопределить, КАК Silex обрабатывает ошибки, но я не нашел способа вернуть оттуда исходный ErrorHandler или переопределить, НЕОБХОДИМО ли Silex обрабатывать ошибки.

Итак, кто-нибудь знает, как либо а) указать Silex использовать мой обработчик ошибок с помощью $app->error() или каким-либо другим способом, б) просто полностью отключить обработку ошибок в Silex, либо в) в качестве последнего прибегнуть к помощи Silex, чтобы он перехватывал фатальные ошибки, чтобы я мог обрабатывать все три типа из $app->error()?

Поскольку я впервые использую Silex, не стесняйтесь исправлять меня или показывать, как вы обрабатываете ошибки в Silex, если есть лучший способ, но также, пожалуйста, ответьте на вопрос, если можете.

Некоторый пример кода:

// This will register itself and then handle all errors.
$handler = new ErrorHandler();

// These are all handled appropriately.
nonexistentfunction();            // Correctly caught by ErrorHandler::handleFatalError
trigger_error("example");         // Correctly caught by ErrorHandler::handlePhpError
throw new \Exception("example");  // Correctly caught by ErrorHandler::handleException

$app = new \Silex\Application();
$app->get('/', function () use ($app) {

    // This is still handled correctly.
    nonexistentfunction();            // Correctly caught by ErrorHandler::handleFatalError

    // However, these are now overridden by Silex.
    trigger_error("example");         // INCORRECTLY DISPLAYS SILEX ERROR PAGE.
    throw new \Exception("example");  // INCORRECTLY DISPLAYS SILEX ERROR PAGE.

});
$app->run();

И очень упрощенный ErrorHandler для справки:

Class ErrorHandler
{
    public function __construct()
    {
        $this->register();
    }

    private function register()
    {
        register_shutdown_function( array($this, "handleFatalError") );
        set_error_handler(array($this, "handlePhpError"));
        set_exception_handler(array($this, "handleException"));
    }

    // Etc.

}

person Eli    schedule 09.04.2016    source источник


Ответы (4)


Я знаю вариант (b), когда вы можете полностью отключить обработчик ошибок приложения Silex, и после этого ваш собственный обработчик ошибок должен работать нормально, как вы его определили.

Полностью отключенный обработчик ошибок Silex:

$app['exception_handler']->disable();

Итак, это будет так:

require_once  'Exception.php'; # Load the class
$handler = new ErrorHandler(); # Initialize/Register it

$app = new \Silex\Application();
$app->get('/', function () use ($app) {


    nonexistentfunction();  
    trigger_error("example");
    throw new \Exception("example");

});
$app->run();
person Meathanjay    schedule 10.04.2016
comment
$app['exception_handler']-›disable(); Спасибо! Это именно то, что мне было нужно. Забавно, теперь, когда вы мне его дали, я могу найти его в API. Хотелось бы, чтобы их документация была немного лучше =o) - person Eli; 11.04.2016

Обратите внимание, что ExceptionHandler::disable() был устарел в версии 1.3 и удалено в версии 2.0. Так:

В Silex до 2.0:

$app['exception_handler']->disable();

В Силексе 2.0+:

unset($app['exception_handler']);
person Konrad Gałęzowski    schedule 08.12.2016

См. документацию по Silex.

По-видимому, вам также необходимо зарегистрировать ExceptionHandler. Silex превратит фатальные ошибки в исключения, чтобы с ними справиться. Кроме того, если я правильно помню, исключения такого рода будут перехватываться, когда они «выбрасываются» внутри контроллеров и промежуточного программного обеспечения (по крайней мере, до промежуточного программного обеспечения), но не внутри моделей.

В конце вы можете добавить следующее для работы с вещами.

// register generic error handler (this will catch all exceptions)
$app->error(function (\Exception $e, $exceptionCode) use ($app) {
    //if ($app['debug']) {
    //    return;
    //}

    return \Service\SomeHelper::someExceptionResponse($app, $e);
});

return $app;

Я надеюсь, что это немного помогло.

person Thanos    schedule 11.04.2016