5

我正在做一个相当大的项目,并且在 stackoverflow 和其他网站上阅读了很多关于异常的内容。结果是,有 100% 的正确或错误。有些会为无效的用户输入抛出异常,有些则不会。有些仅针对运行时错误抛出异常,有些则不会...

我个人喜欢即使对于无效的用户输入也抛出异常的方式。

现在我的问题是,例如,我有一个用户可以评论另一个用户的声明(例如他/她最喜欢的音乐等)。每个用户只能评论一次。现在,为评论创建数据库条目的函数检查用户是否已经对该语句发表了评论。如果是,则抛出异常。通常我会说我将这个异常命名为:ExceptionStatementAlreadyCommented,但我在这个项目中还有许多其他功能,如果我总是创建这样的特定异常,我最终会得到大约 100 到 200 个异常。

这会影响性能吗?我通过 __autoload 函数自动加载所需的类,因此只有在需要时才加载实际的异常。

这是命名这样的异常的好方法吗?过去,我在为不同的错误使用一个异常时遇到了麻烦,因为当我捕获异常时,有时会捕获我不想捕获的异常。

非常感谢您的帮助!

最好的祝福,

弗雷迪

4

3 回答 3

9

我的感觉是你已经过度使用异常了。正如名称所引用的,期望只应在Exceptional Circumstances 下引发。

不应使用异常来控制应用程序的流程。输入错误数据或未​​输入正确用户名和密码的用户将被视为应用程序正常流程的一部分,而不是异常情况。

您应该只在可能导致整个或部分应用程序不可用的异常情况下抛出异常,例如,无法连接到数据库。

这样,您就不会在系统中遇到太多需要捕获甚至重新抛出的异常。

有不同的异常是个好主意,例如,我使用RedBean ORM与我的数据库通信,它使用这些异常:

  • RedBean_Exception_Security(发生安全异常时)。
  • RedBean_Exception_SQL(当出现错误的 sql 语法或其他问题时)。

对异常过于具体会导致很多混乱。例如,如果我对missing sql columnbad syntaxmissing value等有一个例外,它会变得非常难以管理。但是,如果我有一个SQL_Exception, 并将该异常用于上述所有内容,那么管理起来会更加整洁和简单。

至于性能,必须加载大量类(我假设它们在外部文件中)可能会对应用程序造成负担。这可以通过使用APC在内存中缓存解释的 PHP 代码来部分缓解。但是,如果没有任何分析,这很难说。

于 2012-07-13T08:52:16.810 回答
3

最好有一个异常树,从最一般的延伸到最具体的,例如,你的StatementAlreadyCommentedException(这就是它应该被命名的方式,最后是 Exception 部分)应该继承自InvalidUserInputException,或者可能AlreadyExistsException是异常,那些应该从更一般的东西继承,比如Exception.

这样,您可以捕获比您正在搜索的异常更具体的所有异常(如果您需要它)。(你可以 catch Exception,它会捕捉所有可能的异常,你可以 catch AlreadyExistsException,它会捕捉任何扩展它的异常。

于 2012-07-13T08:51:02.880 回答
2

为每种可能的错误类型创建一个单独的异常类是没有意义的。这个想法是异常类名称应该粗略地描述错误,并且每个类都应该设置适当的变量,以便与异常消息一起描述确切的错误。

虽然当前的方法不会影响您的性能(至少异常类的数量不会),但它可能会影响您的可维护性,因为听起来有相当多的精神开销实际上不会产生任何有形的东西益处。

如果您创建一个经过深思熟虑的异常层次结构\Exception,而不是生成 200 个直接扩展.

例如,RecordAlreadyExistsException对所有类似情况使用异常之类的东西,而不是ThisTypeOfRecordAlreadyExistsException对每种情况使用 a 。

于 2012-07-13T08:50:15.363 回答