【问题标题】:The proper way to do exception handling进行异常处理的正确方法
【发布时间】:2017-06-02 01:32:07
【问题描述】:

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

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 文档中:

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

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

    return parent::report($exception);
}

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

php 异常的问题在于它们使用整数。是很烦人的恕我直言。最好将'changeauthor_bookid_notfound' 作为代码而不是随机数。我应该为每个异常创建一个异常类吗?例如不重用MyAppException,这似乎有点乏味。我会有一万亿个课程。

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

什么是处理这种情况的成熟可靠的方法? 代码,每个错误的新类,还有其他东西?

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

【问题讨论】:

  • 感觉你在这里过度使用了异常。您为每次失败的检查抛出异常。您不一定需要所有异常中的错误代码。您可以将单个异常与不同的消息一起使用,然后在处理异常时使用该消息。如果您计划显示自定义错误/页面,您还需要处理 render 方法中的异常。 report 方法仅用于错误报告和日志记录。

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


【解决方案1】:

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

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

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

此外,Laravel 提供了 abort() 魔术方法,它会抛出 HTTP 错误以及自定义错误消息,可以像这样使用:

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

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

【讨论】:

  • findOrFail 给我带来了很多问题,因为我不知道在什么地方触发了错误。这只是一些来自雄辩的东西,远非最佳。当您没有堆栈跟踪时发生。每次有错误深入一些日志文件..嗯,有点糟糕,不是吗?就像“id not found”这样的东西,祝你好运,弄清楚它是 1000 个 findOrFail 中的哪一个。如果您查看代码,在“laravel 不处理参数”的情况下,空字符串将是一个有效的参数,所以有点没用。还有很多关于异常的重要示例。
  • abort 似乎是显示错误的最糟糕的选择,除非我弄错了。几乎是http错误代码的死?重新发明轮子,听起来有点奇怪。您在专业应用程序中想要的是一流的错误处理。因为错误会发生,即使是糟糕的编码,而是 3rd 方库,系统会失败。作为一名优秀的程序员,这不是可选的。
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多