2010-09-19 39 views
5

1)会不会处理异常是一个更好的主意

1 - 只处理异常,你 实际上可以做一些事情,和
2 - 你不能做任何事情,绝大多数的例外

a)我认为“By not handling an exception”文本是建议我们应该让异常冒泡堆栈,在运行时会中止我们的应用程序?

b)但是为什么让运行时中止首选异常而不是捕获异常,将其记录下来,然后通知用户失败?两者之间的区别仅在于后者情况下,应用程序不会中止

例如,如果数据库出现故障,为什么整个程序崩溃(由于未处理异常),如果我们可以捕获异常,记录下来,并通知用户失败,这样我们可以保持程序正常运行。

2)如果你知道某些代码块可能引发的异常无法处理,你应该将此代码包含在try-finally区块还是将它留在try-finally区块之外更好?

谢谢

+1

我不知道引号的全部内容。但我认为正确的解释是:(A)如果你是一个班级设计师,那么遵循这些规则。基本上,不'隐藏意外的例外。 (B)但如果您是*应用*开发者,那么这些规则不适用于您;如果你能帮助它,不要让你的程序崩溃。 – Detmar 2010-09-19 18:41:39

回答

2

尝试寻找它这样...数据库关闭。你怎么知道的?因为你会遇到超时/异常/某事。但是你的应用程序可能没有得到例外。 ADO.NET/LINQ to SQL/Entity Framework /无论您使用的是哪种数据提供程序,实际上都会获取该异常并将其引发至您的应用程序。对我而言,这就是建议的建议:作为组件设计者,更倾向于抛出你无法做任何事情的异常。

对于数据库下来例子,有什么的ADO.NET数据提供者可以做什么?它可以使服务器备份吗?修复网络连接?重置权限?不,所以它不处理异常,它会抛出异常。

你举方针是为组件开发,而不是运行时的边界(线程或应用程序)的外缘。在那个层面上,就如何处理已经冒泡的异常做出决定是正确的。

+0

谢谢大家的帮助 – user437291 2010-09-20 17:49:36

8

不行,原则是不捕捉异常,你不能做任何事情除了在你的应用程序或线程的顶层。

您应该尽量避免让应用程序崩溃 - 在某处记录信息,向用户发送消息以解释发生了什么,并告诉他们如何向您报告错误。也许还会尝试将未保存的数据保存在恢复文件中,以便在下一次应用程序启动时它可以提供尝试恢复其丢失工作的选项。

+0

我同意。在顶层捕捉它,记录它,并且如果它是最终用户应用程序,则向用户显示一个明智的对话框。 – 2010-09-19 18:41:16

1

我想你引述的人认为,你应该让异常泡沫堆栈向上直到有上涨能使它感,直到它到达那里你有代码调用堆栈顶部那将记录下来,或者向用户显示一条错误信息,如果它是致命的,则退出程序,如果不是,则继续。

有时候最好不要继续执行程序 - 例如,如果得到OutOfMemoryException的例子或其他程序操作未定义的其他情况 - 可能会导致灾难。

1

问题是,您不希望try/catch块嵌套在代码中的任何地方,因为这往往会隐藏您的代码问题。最好只在你理解错误和期望结果的地方实现异常处理,否则不要处理它并让它冒泡。

至于错误冒泡,你应该有一个全局的异常处理程序为这些未被捕获的应用程序错误。这只在您的应用中的一个位置实现,并允许您将错误记录或呈现给用户。再次,这只是在您的应用程序的一个位置实现,并通过挂钩application.error事件来实现。

事件挂钩。净赢窗体应用程序:

AppDomain.CurrentDomain.UnhandledException 

事件在.NET asp.net应用程序挂接:

HttpApplication.Error 

享受!

1

我觉得关键

只处理异常,你实际上可以做一些

是,你应该只处理异常,如果你能从该点在随身携带应用

举一个简单的例子。

如果您正在寻找在用户的系统上的文件,它不存在时,它应该是你应该提高“未找到文件”异常。现在,如果你可以从此恢复(比如简单地重新创建文件),那么就这样做并继续。但是,如果文件不能被重新创建,那么你不应该让你的程序继续。

但是,这并不意味着你不能有一个顶层捕获所有异常处理程序在你的主要程序显示一个友好的信息给用户,也许是为了记录异常,甚至邮寄给你的开发人员。

1

该声明适用。但它是在更深层次的应用中引用异常的参考。基本上我们编写的大部分代码都不需要异常处理。只有应用程序的客户端部分负责捕获错误并将其呈现给用户以及日志记录。

例如,可以在Web应用程序中使用相同的业务代码/数据库代码,并且windows/wpf应用程序和日志/处理可能会有所不同,并且更深的层不知道如何处理,因此他们需要将责任留给UI层

+0

“这只是应用程序的客户端部分负责捕获错误......”通过客户端部分,您的意思是类似于Asp.net应用程序? – user437291 2010-09-20 17:50:15

1

没有关于这两个报告的背景知识,指出,这两个语句适用于方法和类然后他们意义:

一段代码,它调用的方法只能处理例外的,它大约有足够的信息上下文。在大多数情况下,一段代码没有足够的信息来处理所有异常。

示例:调用方法SaveData()的一段代码可以在知道它将数据保存到数据库时处理DatabaseStorageException。另一方面,如果这段代码是以存储不可知的方式编程的,那么捕捉这种特定的异常并不是一个好主意。在这种情况下,最好让异常弹出调用堆栈并让其他代码处理异常,该异常有足够的上下文信息来处理它。

相关问题