我最近刚刚学习了异常的机制,现在我正在掌握它们。这里有几个关于它们使用的问题:
是否可以创建自己的空 Exception 类继承自 Exception 类,只是为了有一个单独的异常名称?例如:我正在处理文件,如果文件无法加载文件 - 我会抛出异常
throw new FileException('Не удалось загрузить файл')
`FileException 类本身不包含任何内容
class FileException extends \Exception
{
//empty!
}
第二个问题,从第一个问题开始。我这样做是为了捕捉各种错误。例如,在网站上添加消息时,我可能会得到不同的异常,例如:错误消息、上传文件失败、PDO 错误。也就是说,在控制器中它将如下所示:
public function actionMethod()
{
try {
//some code;
} catch (FileException $e) {
echo 'С файлами что то пошло не так:' . $e->getMessage();
} catch (MessageException $e) {
echo 'С сообщением что то пошло не так:' . $e->getMessage();
} catch (PDOException $e) {
echo 'С БД что то пошло не так:' . $e->getMessage();
} catch (Exception $e) {
echo 'Что то совсем пошло не так :(';
}
}
有可能这样做吗?控制器有这么多catch是正常的吗?这种做法有多好?或者我误解了异常是如何工作的?
您是否需要分别为每个错误提供例外?
回答问题
您需要从以下方面入手:
它应该提供给浏览器,以便用户理解他的错误并纠正它。尝试使这样的信息易于理解。“上传文件失败。请使用允许的格式(docx、xlsx)”
用户不需要知道网站的功能。将其写在您的日志中并说“服务器错误,请稍后再试”。也许您看到了来自 Google 和 Yandex 的消息,“有些东西坏了,但我们已经知道了”。
顺便说一句,您可以写入syslog,PHP 程序员由于某种原因不应该忘记它。如果您将 ELK 之类的内容附加到 syslog,您可以跟踪错误的动态并设置通知。
如果错误发生在深处的某个地方,那很方便
如果某个深度嵌套的方法出现问题,那么抛出异常就像紧急冒泡一样。这比在链中向后返回 null/false 要好。你的代码会变得更干净。
使用异常作为构建逻辑的一种方式,而不是
if ... else ...例子:
防御性编程
其本质是检查传入值和期望值。我最常在两种情况下使用:
与 1C 的交换示例:
创建我们自己的异常类来捕获各种错误是一种好习惯吗?
很好,但不要得意忘形。做到最低限度。如果有更多,你会开始感到困惑和挂起,决定哪个异常更合适。
好文章
原则上,总是有一种绘制异常层次结构的诱惑——它看起来很酷,而且令人赏心悦目。但正如经验所表明的(无论如何,我个人),这是一件相当没有意义的事情。至少引入一个您自己的类是有意义的,因为通常需要将您自己的异常与标准异常区分开来。当您需要向用户提供本地化消息并继续工作时,非致命异常需要另一个类。基本上就是这样,即使对于大型项目,这对也足够了。但总的来说,我建议您保持简单——仅在您认为确实需要时才引入新的异常类。
还有一件事:捕获所有可能的异常类型 - 这种情况是不正常的,只有在必要时才分离异常。这就是建立层次结构的原因。