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

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

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

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

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

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

例外很难。

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

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

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

function new_temp_file:try:name = generate_temp_name()save_temp_file(name)return name catch ExistingNameError:return new_temp_file()

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

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

您应该在每个有风险的位置使用try catch块来抛出需要变量的exception。