Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何命名异常(PHP)?_Php_Performance_Exception - Fatal编程技术网

如何命名异常(PHP)?

如何命名异常(PHP)?,php,performance,exception,Php,Performance,Exception,我在一个相当大的项目上工作,在stackoverflow和其他网站上阅读了很多关于异常的文章。结果是,有100%的对或错。有些为未验证的用户输入抛出异常,有些则不抛出异常。有些仅针对运行时错误引发异常,有些则不 我个人喜欢抛出异常的方式,即使对于未验证的用户输入也是如此 现在我的问题是,例如,我有一个用户可以对另一个用户的声明(例如他/她喜欢的音乐等)进行评论。每个用户只允许对其发表一次评论。现在,为注释创建数据库条目的函数将检查用户是否已经对该语句进行了注释。 如果是,则抛出异常。通常我会说我

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

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

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

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

这样命名异常是一种好方法吗? 在过去,我很难对不同的错误使用一个异常,因为当我捕获异常时,有时会捕获我不想捕获的异常

非常感谢你的帮助

致以最良好的祝愿


Freddy

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

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

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


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

最好有一个异常树,从最一般的扩展到最具体的,例如,您的
语句ReadyCommentedException
(应该这样命名,末尾有异常部分)应该继承自
InvalidUserInputException
,或者可能继承自
AlreadyExistException
异常,这些应该继承自更一般的内容,如
Exception


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

我的感觉是,您已经过度使用异常了。正如名称所述,只有在异常情况下才应抛出期望。

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

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

这样,您就不会在系统中遇到如此多的异常,这些异常需要捕获,甚至可能需要重新刷新

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

  • RedBean\u异常\u安全(发生安全异常时)
  • RedBean\u异常\u SQL(当出现错误的SQL语法或其他问题时)
对异常过于具体可能会导致很多混乱。例如,如果我对
缺少sql列
语法错误
缺少值
,等等有一个异常,它可能变得非常不可管理。但是如果我有一个
sql\u异常
,并将该异常用于上述所有内容,那么它就更难管理了管理起来更整洁、更简单


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

似乎过于工程化,为什么不在自己的消息中抛出一个常规的
异常
?嗯,我正在努力解决的一件事是,为什么甚至需要创建不同的异常我知道,对异常进行分类是有意义的,但如果所有未捕获的异常都可以终止该过程,那么捕获它们的名称就无关紧要了,因为每个脚本停止程序都必须在以后捕获到
异常t如果你想记录它们以便以后分析,这会使事情变得更容易。例如,你可以使用
fluentd
之类的工具在终止之前拦截并登录全局异常处理程序。如果异常被分类,则可以很容易地用fluentd存储并用kabana之类的工具对其进行分析。然后你可以问如下问题
最常见的数据库连接故障是什么?原因是什么?
使用我们的事务性电子邮件提供商的api发送电子邮件时经常出现问题?
对不起,我的意思是说
kibana
日志分析软件,没有