【问题标题】:Lumen 5.6 Error handling (throws exception twice)Lumen 5.6 错误处理(两次抛出异常)
【发布时间】:2018-08-19 19:06:44
【问题描述】:

这是我处理任何错误的代码:

App\Exceptions\Handler::class

public function render($request, Exception $e)
{

    $fe = \Symfony\Component\Debug\Exception\FlattenException::create($e);

    $statusCode = $fe->getStatusCode();
    $code       = $fe->getCode();
    $message    = $fe->getMessage();

    $errorObj = new \App\LOHDomain\Entities\Error($code, $message);

    return response()->json(['data' => null, 'error' => $errorObj], $statusCode);
}

当我将虚假的 WSDL URL 解析到 SoapClient 时,它会引发两个异常

{"data":null,"error":{"code":"0","message":"SOAP-ERROR: Parsing WSDL: Couldn't load from 'asdsd' : failed to load external entity \"asdsd\"\n"}}
{"data":null,"error":{"code":"1","message":"SOAP-ERROR: Parsing WSDL: Couldn't load from 'asdsd' : failed to load external entity \"asdsd\"\n"}}

所以 json 响应变得无效

在vendor中注释这行代码时,会抛出一个异常:

Laravel\Lumen\Concerns\RegistersExceptionHandlers 特征

protected function registerErrorHandling()
{
        error_reporting(-1);

        set_error_handler(function ($level, $message, $file = '', $line = 0) {
            if (error_reporting() & $level) {
                throw new ErrorException($message, 0, $level, $file, $line);
            }
        });

        set_exception_handler(function ($e) {
            $this->handleUncaughtException($e);
        });

//        register_shutdown_function(function () {
//            $this->handleShutdown();
//        });
}

那么,问题是什么?以及如何在不编辑供应商的情况下解决它?

【问题讨论】:

    标签: php lumen laravel-5.6 lumen-5.5


    【解决方案1】:

    解决办法是清除最后一个错误,因为它触发了两次。

    1. 错误异常。
    2. 二是关机功能。

    所以,解决办法是:

    App\Exceptions\Handler::class

    public function render($request, Exception $e)
    {
    
        $fe = \Symfony\Component\Debug\Exception\FlattenException::create($e);
    
        $statusCode = $fe->getStatusCode();
        $code       = $fe->getCode();
        $message    = $fe->getMessage();
    
        $errorObj = new \App\Domain\Entities\ResponseEntites\Error($code, $message);
    
        /**
         * This line of code resolves the issue
         * 
         * To reproduce the issue :
         * 1) Comment this following line of code
         * 2) Provide a fake WSDL URL to the SoapClient
         *
         * Recommendation: Remove this line if you aren't using the SoapClient
         */
        error_clear_last();
    
        return new \Illuminate\Http\JsonResponse(['data' => null, 'error' => $errorObj], $statusCode);
    }
    

    这不是最佳解决方案(但这是我尝试过的最佳解决方案)。 如果您有更好的测试解决方案,请分享。

    链接:

    1. Fatal exceptions are handled twice
    2. Code change

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 2013-07-24
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多