2016-04-09 4 views
3

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

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

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

Я понимаю, что я могу использовать $ app-> error() для переопределения HOW Silex обрабатывает ошибки, но я не нашел способ отбросить их обратно к исходному ErrorHandler или переопределить WHETHER Silex ошибки.

Итак, кто-нибудь знает, как: a) сказать Silex использовать мой обработчик ошибок, используя $ app-> error() или каким-либо другим способом, b) просто отключить обработку ошибок в Silex целиком или c) как в крайнем случае, получить 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. 

} 

ответ

2

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

Полностью отключен обработчик 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(); 
+0

$ app ['exception_handler'] -> disable(); Благодаря! Это именно то, что мне нужно. Забавно, теперь, когда вы дали его мне, я могу найти его в API. Я хочу, чтобы их документация была немного лучше = o) – Eli

-2

Вы должны зарегистрировать определенного провайдера в вашем приложении: https://github.com/whoops-php/silex-1

+0

Чувак, серьезно. Вы даже прочитали вопрос? И, прочитав вопрос, я имею в виду даже просто прочитать название вопроса? Даже просто название. – Eli

1

См Silex doc

Казалось бы, вы должны зарегистрировать 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; 

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

2

Обратите внимание, что ExceptionHandler :: disable() было deprecated in 1.3 and removed in 2.0.Итак:

В Silex, прежде чем 2,0:

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

В Silex 2.0+:

unset($app['exception_handler']); 
Смежные вопросы