总是在更高级别的对象中捕获异常是一种好习惯吗?

时间:2014-03-23 15:03:52

标签: php oop exception exception-handling

随着项目变得越来越大,我对于应该抛出什么类型的异常以及应该捕获它们的位置感到困惑,例如:如何组织内部异常与应向最终用户显示的异常消息。为了避免混淆,最好总是在更高级别的对象中捕获异常吗?

举个例子:如果我有一个数据库类在数据库中插入一行,并且该类由另一个处理数据的对象调用,而这个数据处理对象又被控制器调用,它是否正确从处理类中的数据库类中捕获错误,这可能会重新抛出要在控制器类中捕获的错误?或者可以在控制器类中捕获数据库类中抛出的错误吗?

此外,如果处理类中的一个方法被同一个类中的另一个方法调用,并且第一个方法抛出错误,是否可以在同一个类中捕获异常?或者它应该被推迟到正在调用它的更高级别的类中?

关于如何在具有多个级别的大型项目中构建和组织异常,还有其他任何提示吗?

2 个答案:

答案 0 :(得分:2)

我喜欢将异常视为预期的事件,这些事件可能会中断正常的程序流,但是会以有序和受控的方式。 您的异常处理任务是处理这种情况并解决它,使您的程序状态保持有效并且应用程序可以继续。

因此,您应该在调用层次结构的第一个位置添加异常处理,以便您实际能够解决该情况。 这可能包括清理以前不再需要的以前打开的资源,记录事件或向用户提供反馈。

在您的示例中,我可能会将处理逻辑留给控制器。 数据库通常没有足够的上下文来处理刚刚发生的事情以及如何处理特定条件,因为这些依赖于调用数据库的上下文。 另一方面,您的控制器应该具有所有上下文信息,并且应该清楚该程序刚刚尝试做什么。 它也可能更适合解决问题,例如向用户显示一般错误消息,并可能向管理员发送详细的错误报告。

有时您也会遇到需要在中间级别捕获异常,进行一些清理(如关闭流或回滚某些操作)然后重新抛出异常的情况,因为您知道您只解决了部分问题情况。

总而言之,一般建议是考虑需要采取哪些措施来解决此类异常事件,然后实施错误处理,以便轻松完成这些操作。

答案 1 :(得分:1)

  1. 应该在例外事件中引发异常,即如果某些内容严重错误且代码无法继续。例如。数据库已关闭,远程服务未响应,收到严重错误的输入。
  2. 如果您遇到异常,您需要知道如何处理它。引发异常时,表示您的应用程序处于严重错误状态。如果您发现异常,您应该对如何从此错误状态进行严格计划。如果你没有计划,就没有必要抓住它。如果数据库已关闭,您可能希望停止该程序。另一方面,如果远程HTTP请求产生404响应并且您的HTTP处理程序将其作为异常抛出,您可能能够忍受该错误并继续(取决于该请求应该用于什么)
  3. 永远不应向最终用户显示原始异常消息。需要记录异常,但是最终用户应该只看到一个通用的好的"糟糕,出错了,也许你想尝试X而不是......" 消息。这不是特例,它只是很好的用户体验设计。