捕获错误的最佳时间C#

时间:2016-08-24 20:31:40

标签: c# exception exception-handling

我正在尝试使用最好的异常处理方法,但我有点迷失。

例如,如果我有4个方法(1个调用另一个调用另一个方法......)。 对于每个方法,都可以抛出相同类型的自定义异常。

假设我在第4种方法中引发了错误。我是否需要在第3个中捕获它或者我可以在第一个中捕获它?

因为如果我尊重需要尽快捕获错误的原则,我应该将catch放在所有的第一种方法而不是第一种方法中。

Method1()
{
    Method2();
}

Method2()
{
    Method3();
}

Method3()
{
    Method4(); 
}

Method4()
{
    //Some code that could throw a customException
}

1 个答案:

答案 0 :(得分:6)

  

我正在尝试使用最好的异常处理方法,但我有点迷失。

编写健壮的软件很难。

  

如果我尊重需要尽快发现错误的原则

这是一个糟糕的原则。 可能性与它有什么关系?您应该只编写可能的代码的原则没有帮助。 时间与它有什么关系?这是一个重言式,处理异常的正确位置是,可以正确处理异常;既不也不以后

在哪里可以正确处理异常?这完全取决于(1)异常和(2)您打算如何处理它。这听起来像是非常无益的建议,但你的问题非常模糊!让我们将异常排除在外,只考虑计算。放置计算的最佳位置在哪里?更早或更晚进行计算是否更好?你怎么可能为所有可能的计算回答这个问题?

  

我只是想避免在我的所有方法中捕获相同类型的错误,所以我可以在我的大方法中添加一个catch?

好吧,让我们考虑一下。假设为了参数,每个方法处理异常都正确。在什么情况下将异常处理移出每个被调用者并进入调用者是正确的?这很容易列举:

  • 处理程序不得依赖于只有被访者知道的任何状态,而不能依赖于来电者。
  • 处理程序必须在每个被调用者中执行相同的操作。
  • 不得从呼叫者以外的任何地方呼叫被叫方。

那是你所处的情况吗?然后可以在不改变语义的情况下将处理程序移动到调用者中,从而减少重复的代码。

  

我想关闭我的应用程序,因此请记录错误并关闭我的应用程序

然后将处理程序尽可能靠近Main。

或者,处理“我正在卸载appdomain因为我得到了一个未处理的异常”事件并将你的处理逻辑放在那里。

我注意到,如果你的应用程序像那样异常关闭,你无法保证你的日志记录系统不会爆炸,你可能会再次爆炸它。小心!