如何命名异常(PHP)


How to name exceptions (PHP)?

我正在做一个相当大的项目,在stackoverflow和其他网站上读了很多关于异常的文章。结果是,有100%的对或错。有些会为未验证的用户输入抛出异常,有些则不会。有些只针对运行时错误抛出异常,有些则不。。。

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

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

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

这样命名异常是个好方法吗?在过去,我很难将一个异常用于不同的错误,因为当我捕捉到异常时,有时我会捕捉到我不想捕捉的异常。

非常感谢你的帮助!

致问候,

Freddy

我的感觉是您过度使用了异常。正如名称所引用的那样,期望只能在异常情况下抛出。

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

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

这样,你就不会在系统中遇到太多需要捕捉甚至重新思考的异常。

有不同的异常是个好主意,例如,我使用RedBean ORM与我的数据库进行对话,它使用以下异常:

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

对异常过于具体可能会导致很多混乱。例如,如果我对missing sql columnbad syntaxmissing value等有一个异常,它可能会变得非常不可映射。但是,如果我有一个SQL_Exception,并将该异常用于以上所有操作,那么它的管理会更加整洁和简单。

至于性能,必须加载很多类(我假设它们在外部文件中),这可能会对应用程序造成负担。这可以通过使用APC在内存中缓存解释的PHP代码来部分缓解。但如果不进行任何剖析,就很难判断出这一点。

最好有一个异常树,从最通用的扩展到最特定的,例如,您的StatementAlreadyCommentedException(这就是它的命名方式,末尾有Exception部分)应该继承自InvalidUserInputException,或者AlreadyExistsException异常,这些应该继承自更通用的东西,如Exception

通过这种方式,您可以捕获比您正在搜索的异常更具体的所有异常(如果您需要的话)。(您可以捕获Exception,它会捕获每一个可能的异常,您可以捕获AlreadyExistsException,它会捕捉任何扩展它的异常。

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

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

如果您创建一个经过深思熟虑的异常层次结构,而不是生成200个直接扩展'Exception的异常类,情况也会更好。

例如,对所有类似的情况使用类似RecordAlreadyExistsException的异常,而不是对每个情况使用ThisTypeOfRecordAlreadyExistsException