我们如何以及在何处编写try catch块来处理异常

时间:2010-03-12 06:01:40

标签: c# exception-handling

我们正在使用C#语言开发Windows应用程序。

我们的Windows应用程序包含三个层(UI,Business和DataAccess层)。在业务层中,有一些公共(业务)方法,UI通过这些方法与业务层类进行通信。这些公共方法还有一些私有方法来实现所需的功能。 DataAcess层中有一些方法是从Business层类调用的。

在这种情况下,我应该在哪里试试? a)在业务层公共方法中 b)忙碌层私密方法 c)在DataAccess Layer方法中 d)在调用Business方法的UI方法中。

3 个答案:

答案 0 :(得分:3)

您应该只在遇到异常时处理异常,并且希望对特定异常执行某些操作。否则,IMO,最好让它们冒泡层,这样你就有了完整的堆栈跟踪。即使在表示层,我也倾向于让错误冒出来(即进入一个友好的错误屏幕),除非这是我特别期待的例外。

有例外的一般规则是检查您的输入以避免它们,预期您希望得到的输入并让其他所有内容都异常并抛出错误。错误和堆栈跟踪是一件好事。他们让你知道出了什么问题,出了什么问题。如果一个给定的层掩盖了它的错误,几乎不可能确定出了什么问题。

答案 1 :(得分:0)

例外很难。

你应该只抓住你期望发生的那些,你期望的那些应该在一个知道它试图完成的任务的抽象层次上被抓住,而不是只知道一小部分的低层任务。

例如,您有一个保存临时文件的功能。该函数调用函数,例如,生成临时文件名,保存文件,然后返回临时文件路径。

如果文件保存功能表明您为其提供了目录中已存在的文件名,那么该功能不应该处理它。它不知道命名临时文件。您调用以保存临时文件的函数应该可以处理它 - 它知道命名文件,它知道您可能创建一个重复的文件。因此,您可以生成新名称并重试。

function new_temp_file:     尝试:         name = generate_temp_name()         save_temp_file(名称)         返回名称     catch ExistingNameError:         返回new_temp_file()

如果你发现它高于此值,那么较高的抽象级别对较低级别的了解太多了。

这只是一个简单的例子,但我希望你得到的东西我是如此暧昧地说:抓住一个应该捕获异常的异常。

答案 2 :(得分:-2)

你应该在每个有风险的位置使用try catch块来抛出需要变化的异常。