我在这里问了几个问题并阅读了一些关于异常处理的文章,但是我不认为我应该在你应该什么时候以及什么时候不应该处理异常。从我读过的文章中可以看出“只处理你可以从中恢复的异常”这是什么意思。如果我无法处理异常,我该怎么办?让它传播回堆栈?如果我不处理它,我如何记录它并提供用户友好的错误消息。大多数人在网络应用和网络服务方面做了什么?
作为一个例子,我说有一个从sql
中提取数据的较低层数据层try{
//do something with db
}catch(SqlException ex){
//what should i do here
//should i call code again to retry getting data from db
}catch(Exception ex){
//should i even catch exception of type exception
}
如何处理较低层中的异常?我应该让异常泡到层级吗?如果是这样,那么如果我想捕获sqlexception类型的异常,那么我需要对库的引用sqlexception是一部分,但我当然不应该在与数据访问无关的层中引用该库。
答案 0 :(得分:2)
一些简单的基本规则:
处理异常需要程序的状态完全与导致异常的代码启动之前的状态相同。你需要大量的catch和finally块才能将变量恢复到初始状态。
只有在捕获异常时才考虑处理异常允许程序以有意义的方式继续运行。例如,当数据库服务器离线时很难做任何有用的事情,也可以停止程序。
如果您需要人员采取纠正措施(您几乎总是这样做),请确保她有足够的信息来解决问题。让异常冒泡到UI层。避免解释异常(例如,“无法更新数据库”),显示确切的异常消息和堆栈跟踪。
为AppDomain.CurrentDomain.UnhandledException实现处理程序,并记录或显示e.ExceptionObject的值。帮助诊断未处理的异常。并帮助您避免将捕获物放在任何地方。
具有良好诊断功能的一百个未处理异常优于一个破坏程序稳定性的异常,因此它会生成错误数据或导致其他无关异常被抛出。
答案 1 :(得分:1)
好的,这将是太短暂的,因为它仍然在清晨,但我一直在努力解决这个问题,所以这就是我的理解:
“仅处理您可以从”
恢复的例外情况
我的理解是,您可以在代码中的某个级别获得异常,您可以在其中执行某些操作。对于低级代码,您可以将异常气泡备份到一个层,您可以在其中修改“进程”以处理异常并可能再次尝试该过程。 (我通常会将错误记录在错误的位置。)
答案 2 :(得分:1)
异常管理是一个很大的主题,因此我只会触及表面。
从我读过的文章中可以看出“只处理你可以从中恢复的异常”这是什么意思。
如果您不知道如何从特定的异常中恢复,那么抓住它通常没有任何意义。如果它是一个Web应用程序或服务,Web服务器本身将处理日志记录和恢复。
在某些情况下,您需要捕获异常,以便可以进行常规恢复,例如通过取消或撤消事务。在这种情况下,可接受的方法是 捕获异常,执行泛型恢复,然后再次抛出异常。
如果我无法处理异常,我该怎么做。让它支持堆栈?
是
如果我不处理它,我如何记录它并提供用户友好的错误消息。大多数人在网络应用和网络服务方面做了什么?
Web服务器将记录异常。如果要在Web应用程序中显示用户友好的错误消息,可以捕获/记录堆栈的最高级别并重定向到您的错误消息。同样,我会尝试不捕获System.Exception - 而是列出应用程序抛出的异常列表,并在呈现针对每种类型定制的消息之前捕获这些类型。随着异常类型列表的增长,要么通过更改代码来阻止每个新的异常类型,要么为该异常类型添加新的catch。
在Web服务中,您可以创建自定义异常,并将其作为节点添加到Web服务将提供的常规异常中。
在你的代码示例中,我不会使用try ... catch,除非你期待一个异常并且你知道如何处理它。
如何处理较低层中的异常。我是否应该让异常泡到层级。
是。