Php 处理异常的正确方法

Php 处理异常的正确方法,php,laravel,exception,laravel-5,exception-handling,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 cou

现在我在写代码时通常做的事情是这样的

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文件中,我们看到:

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

php异常的问题是它们使用整数。我觉得很烦人。最好将“changeauthor\u bookid\u notfound”作为代码而不是随机数。我应该为每个异常创建一个异常类吗?e、 g.不重用
MyAppException
,这似乎有点乏味。我会有一万亿个班级

现在,如果对于一个特殊的异常,我需要特殊的处理,我的代码,我不能很容易地做到这一点。我没有要检查的代码(例如,
$exception->code==3331然后执行特殊操作
),也没有自定义的异常类

处理这起案件的可靠方法是什么? 代码,每一个错误都有新的类,还有其他的东西

如果提供一个代码,什么是一个好方法?

正确的方法是为每个异常定义一个自定义异常类,或者根据抛出的错误类型定义自定义异常,但是,请注意,Laravel已经有许多内置的异常和机制来处理您概述的用例

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

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

此外,Laravel还提供了
abort()
magic方法,该方法会抛出HTTP错误和自定义错误消息,可以这样使用:

abort(418, "I'm a teapot...")

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

这里感觉您过度使用了异常。您正在为每个失败的检查抛出一个异常。您不必在所有异常中都需要错误代码。您可以对不同的消息使用单个异常,然后在处理异常时使用该消息。如果计划显示自定义错误/页面,还需要在
render
方法中处理异常。
report
方法仅用于错误报告和日志记录。findOrFail给我造成了太多问题,因为我不知道错误是在什么地方触发的。这只是一些来自雄辩的东西,远远不是最佳的。在没有堆栈跟踪时发生。每次出现错误时,请深入挖掘某个日志文件。。嗯,有点糟糕,不是吗?就像“我没找到”一样,好吧,祝你们好运,找出1000个findOrFail中的哪一个。如果您查看代码,在“laravel handles no arguments”的情况下,空字符串将是一个有效的参数,因此它有点无用。异常的例子还有很多。abort似乎是显示错误的最糟糕的选项,除非我弄错了。几乎是一个有http错误代码的骰子?重新发明轮子,听起来有点奇怪。在专业应用程序中,您需要的是一流的错误处理。因为错误会发生,即使是糟糕的编码,但第三方LIB系统会失败。对于一个好的程序员来说,这不是一件可选的事情。
abort(418, "I'm a teapot...")