#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 вместо этого.