Обработка ошибок Symfony 3

#symfony #symfony-3.4

#symfony #symfony-3.4

Вопрос:

Есть ли способ обработать все ошибки, например, с моих контроллеров symfony, если я получу эту ошибку:

введите описание изображения здесь

В моем контроллере есть способ с помощью try / catch получить эту ошибку?. Например:

 class SomeClass extends Controller
{
    public function doSomethingAction(Request $request){
        //do something
        try {
            //do something
        }
        catch(Exception $e){
            dump("ERROR:".$e->getMessage()); //<--this is not dumping anithing
        }
    }
}
  

Я всегда получаю сообщение о красном экране при предварительном просмотре сетевого вызова:
введите описание изображения здесь

Вместо чего-то вроде:

«ОШИБКА: Ошибка типа: передан аргумент 1…..

Комментарии:

1. Вы предоставляете нам недостаточно информации. Вы уверены, что //do something это то, что вызывает ваше исключение, а не внедрение зависимости или ошибочное ParamConverter значение?

Ответ №1:

С PHP 7 вы можете обрабатывать ошибки PHP, такие как TypeErrors из-за несоответствия типов (как в вашем примере), а также исключения, перехватывая их общий интерфейс Throwable .

Вы должны быть осторожны с этим, особенно с внешними контроллерами, поскольку это может помешать вам увидеть неожиданные ошибки, которые могут привести к проблемам в дальнейшем, или вы не увидите, когда части вашего приложения полностью сломаны. По крайней мере, у вас должно быть надлежащее ведение журнала.

Таким образом, вы можете перехватывать ошибки вместе с исключениями, подобными этому:

 try {
    ...
} catch (Throwable $error) {
    ...
}
  

Комментарии:

1. Это то, о чем я сначала подумал. Но FatalThrowableError расширяет FatalErrorException то, что распространяется ErrorException на Symfony . И ErrorException на самом деле это исключение, а не Error , поэтому должен выполняться OP catch.

2. FatalThrowableError используется DebugHandler Symfony для переноса ошибок php, например, для единообразной обработки ошибок и исключений внутри прослушивателя исключений. Внутри формы это все равно должно быть обычным, TypeError что означает, что это Throwable . Смотрите github.com/symfony/debug/blob/master/ErrorHandler.php#L645 (сам метод используется внутри register() для register_shutdown_function() )

3. Верно, меня обманул тот факт, что мы видим только начало трассировки стека

4. Может быть, стоит порекомендовать перехватить, TypeError а не Throwable затем, сузить круг поиска и не перехватывать все, как вы прекрасно указали

5. Да, это тоже сработало бы, и в большинстве случаев я бы посоветовал сделать это, чтобы предотвратить проблемы, то есть неосознанное подавление ошибок, о которых я упоминал в своем ответе. Я просто понял, что вопрос заключается в том, как перехватывать как можно шире, вот почему я использовал Throwable вместо этого.