【问题标题】:Try catch doesn't work properly in Laravels middleware?Try catch 在 Laravel 中间件中无法正常工作?
【发布时间】:2020-04-22 17:59:30
【问题描述】:

在中间件中使用 try catch 覆盖默认异常处理程序时,它不起作用。未捕获异常。

class NotWorkingTryCatchMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */


    public function handle($request, Closure $next)
    {

        try {
           if ( somethingThatCouldThrowAnException() ) {
                $request->newVariable = true;
           }
        } catch (\Exception $e) {
            dd('Never gets ran, Laravel default handler overrides');
        }

        return $next($request);
    }
}

【问题讨论】:

    标签: laravel error-handling try-catch middleware laravel-6


    【解决方案1】:

    代替

    catch (\Exception $e) { 
    

    你应该使用:

    catch (\Throwable $e) {
    

    以确保将捕获所有类型。 PHP 7 中的异常和错误都扩展了Throwable

    【讨论】:

      【解决方案2】:

      查看源代码,您需要捕获 \Throwable 以使您的 try catch 在中间件中正常工作。 \Throwable 是一个非常广泛的包罗万象,理想情况下,您将 try catch 块用于不需要考虑其错误的代码。这适用于 Laravel 5.8

      class TryCatchMiddleware
      {
          /**
           * Handle an incoming request.
           *
           * @param  \Illuminate\Http\Request $request
           * @param  \Closure $next
           * @return mixed
           */
      
      
          public function handle($request, Closure $next)
          {
      
              try {
                 if ( somethingThatCouldThrowAnException() ) {
                      $request->newVariable = true;
                 }
              } catch(\Exception $e) {
                  // do nothing
              } catch (\Throwable $e) {
                  // do nothing
              }
      
              return $next($request);
          }
      }
      

      【讨论】:

      • 这是非常糟糕的做法。如果您知道存在某些可以忽略的异常或可抛出对象,则应特别忽略它们。忽略所有异常将导致代码无法调试。这类似于使用错误抑制,这是一种反模式
      • 我没有列出所有可能的异常的原因是因为确认错误后的响应都是一样的,继续正常的请求。这就是为什么它们允许您捕获所有异常,如果它除了不好的做法之外没有其他用途,为什么还要将它包含在语言中?如果我对每种异常类型都做了截然不同的事情,那么您所说的将是相关的,但我不是。
      • @apokryfos 对您的回复感兴趣,总是愿意评估意见,只是看不到这里。 :)
      • 一揽子异常捕获从广义上讲是不好的做法,因为它类似于做例如@somethingThatCouldThrowAnException() 出于同样的原因,这是不好的做法。如果somethingThatCouldThrowAnException 可能会抛出异常,那么通常它可能会抛出一组有限的异常,因此您应该捕获这些异常。例外总是有可能是完全出乎意料的,并且是您想知道的
      • 是的,我同意,如果我要对每种异常类型执行不同的操作,或者如果我想收到关于我的代码库中出现的新异常的通知。但是,在这种情况下,Exception1 和 Exception2 之间的区别并不重要。公平点?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2013-04-15
      • 1970-01-01
      • 2018-01-02
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多