现在我在编写代码时通常会做的就像这样
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
),我也没有自定义异常类
处理这种情况的有效方法是什么? 代码,每个错误的新类,还有其他什么都在一起?
如果提供代码,有什么好办法呢?
答案 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>