我正在处理异常并尝试创建异常监听器,其中将记录与电子邮件相关的异常。
但问题是当我捕获抛出的异常以向用户显示消息时,不会调用侦听器:
try {
try {
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('AppBundle:User')
->getUserByEmail('abc@example.com');
}
catch(\Doctrine\DBAL\DBALException $e) {
throw new \Doctrine\DBAL\DBALException('DBAL error!!');
}
}
catch(\Exception $e) {
echo $e->getMessage();
}
在未呈现错误时调用相同的侦听器:
try {
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('AppBundle:User')
->getUserByEmail('abc@example.com');
}
catch(\Doctrine\DBAL\DBALException $e) {
throw new \Doctrine\DBAL\DBALException('DBAL error!!');
}
异常监听器:
class ExceptionListener {
public function onKernelException(GetResponseForExceptionEvent $event) {
$exception = $event->getException();
if ($exception instance of \Doctrine\DBAL\DBALException) {
//log the error
}
...
...
}
}
我想要做的是在一个地方正确管理错误。感谢。
答案 0 :(得分:1)
我实际上忽略了内核事件。抛出异常时,HttpKernel类会捕获它并调度kernel.exception
事件。 该事件仅在未被捕获的情况下发生。
出现未捕获的异常时会发生EXCEPTION事件。
此事件允许您为抛出的异常或创建响应 修改抛出的异常。事件监听器方法接收一个 Symfony的\分量\ HttpKernel \事件\ GetResponseForExceptionEvent 实例
http://api.symfony.com/3.0/Symfony/Component/HttpKernel/KernelEvents.html