随着项目变得越来越大,我对于应该抛出什么类型的异常以及应该捕获它们的位置感到困惑,例如:如何组织内部异常与应向最终用户显示的异常消息。为了避免混淆,最好总是在更高级别的对象中捕获异常吗?
举个例子:如果我有一个数据库类在数据库中插入一行,并且该类由另一个处理数据的对象调用,而这个数据处理对象又被控制器调用,它是否正确从处理类中的数据库类中捕获错误,这可能会重新抛出要在控制器类中捕获的错误?或者可以在控制器类中捕获数据库类中抛出的错误吗?
此外,如果处理类中的一个方法被同一个类中的另一个方法调用,并且第一个方法抛出错误,是否可以在同一个类中捕获异常?或者它应该被推迟到正在调用它的更高级别的类中?
关于如何在具有多个级别的大型项目中构建和组织异常,还有其他任何提示吗?
答案 0 :(得分:2)
我喜欢将异常视为预期的事件,这些事件可能会中断正常的程序流,但是会以有序和受控的方式。 您的异常处理任务是处理这种情况并解决它,使您的程序状态保持有效并且应用程序可以继续。
因此,您应该在调用层次结构的第一个位置添加异常处理,以便您实际能够解决该情况。 这可能包括清理以前不再需要的以前打开的资源,记录事件或向用户提供反馈。
在您的示例中,我可能会将处理逻辑留给控制器。 数据库通常没有足够的上下文来处理刚刚发生的事情以及如何处理特定条件,因为这些依赖于调用数据库的上下文。 另一方面,您的控制器应该具有所有上下文信息,并且应该清楚该程序刚刚尝试做什么。 它也可能更适合解决问题,例如向用户显示一般错误消息,并可能向管理员发送详细的错误报告。
有时您也会遇到需要在中间级别捕获异常,进行一些清理(如关闭流或回滚某些操作)然后重新抛出异常的情况,因为您知道您只解决了部分问题情况。
总而言之,一般建议是考虑需要采取哪些措施来解决此类异常事件,然后实施错误处理,以便轻松完成这些操作。
答案 1 :(得分:1)