进行异常处理的正确方法

时间:2017-06-02 01:32:08

标签: php laravel exception laravel-5 exception-handling

现在我在编写代码时通常会做的就像这样

function changeBookAuthor(int $id, string $newName){
  if(!$newName){
   throw new MyAppException('No author name was provided');
  }

  $book = Books::find($id);

  if(!$book){
   throw new MyAppException('The provided book id could not be found');
  }
}

在laravel doc中我们看到:

https://laravel.com/docs/5.4/errors

public function report(Exception $exception)
{
    if ($exception instanceof CustomException) {
        //
    }

    return parent::report($exception);
}

现在我如何正确处理异常?它们都是相同的例外,它们也没有代码。我应该提供错误代码吗?

php异常的问题是它们使用整数。非常烦人的imho。最好是'changeauthor_bookid_notfound'作为代码而不是随机数。我应该为每个例外创建一个异常类吗?例如不重用MyAppException似乎有点单调乏味。我会有一万亿课。

现在,如果对于一个特殊的例外我需要特殊处理,使用我的代码,我不能轻易做到。我没有要检查的代码(例如$exception->code == 3331 then do special),我也没有自定义异常类

处理这种情况的有效方法是什么? 代码,每个错误的新类,还有其他什么都在一起?

如果提供代码,有什么好办法呢?

1 个答案:

答案 0 :(得分:0)

“正确”的方法是为每个异常定义一个自定义Exception类,或者根据抛出的错误类型定义自定义异常,但要意识到Laravel已经有很多内置的异常和机制用于处理您概述的用例。

例如,在“Book Not Found”异常的情况下,您可以使用Books::findOrFail($id);,而不是自己手动触发异常,而ModelNotFoundException会在适当的时候抛出abort()的实例。

此外,在PHP中,不需要处理未提供的参数的异常。除非明确表示为可选,否则所有方法参数都是必需的,如果缺少参数,Laravel将抛出PHP异常。

此外,Laravel提供abort(418, "I'm a teapot...") 魔法方法,该方法会抛出HTTP错误以及自定义错误消息,并且可以像这样使用:

    Scanner scan=new Scanner(System.in);
    if(scan.next().charAt(0)=='a'){
        System.out.println("correct");
    }

因此,如果必须重新发明轮子,正确的方法是定义自定义异常类并为这些类定义自定义处理程序,但要意识到Laravel已经有许多内置工具来管理异常而无需这样做。 / p>