ZF3您可以记录未捕获的异常吗?

时间:2018-08-26 20:51:34

标签: php zend-framework zend-framework3

由于在另一个主题上回答不礼貌,我再次在这里提出与此主题相关的问题:

How to log ZF2 controller exceptions

有人说您可以用这种方式记录任何未捕获的异常,但是不是未捕获的异常退出了由PHP完成的Web服务器的进一步运行吗?我想知道这里有什么想法或尝试要做的事情。

public function onBootstrap(MvcEvent $e)
    {
        $eventManager = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);
        /**
         * Log any Uncaught Exceptions, including all Exceptions in the stack
         */
        $sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
        $sm = $e->getApplication()->getServiceManager();
        $sharedManager->attach('Zend\Mvc\Application', 'dispatch.error',
            function($e) use ($sm) {
                if ($e->getParam('exception')){
                    $ex = $e->getParam('exception');
                    do {
                        $sm->get('Logger')->crit(
                            sprintf(
                               "%s:%d %s (%d) [%s]\n", 
                                $ex->getFile(), 
                                $ex->getLine(), 
                                $ex->getMessage(), 
                                $ex->getCode(), 
                                get_class($ex)
                            )
                        );
                    }
                    while($ex = $ex->getPrevious());
                }
            }
        );

1 个答案:

答案 0 :(得分:0)

  

是不是未捕获的异常退出了PHP完成的Web服务器的进一步运行

不,未捕获的异常只会在标准PHP设置下停止处理当前请求,无论是mod-php还是fpm或cgi。 Zend \ Mvc会在分发过程中捕获所有异常,并使它们可用于'dispatch.error'处理程序(您发布的代码就是这样的处理程序,用于记录异常和链中所有先前的异常)。因此,并不是没有真正的例外。