捕捉错误的最佳时间C#

捕捉错误的最佳时间C#,c#,exception,exception-handling,C#,Exception,Exception Handling,我正在尝试使用最佳的异常处理实践,但我有点迷失了方向 例如,如果我有4个方法(1调用调用另一个的另一个…)。 对于每个方法,都可以抛出相同类型的自定义异常 假设我在第四个方法中抛出了一个错误。我需要在第三节课上接住它还是我可以在第一节课上接住它 因为如果我尊重需要尽快捕获错误的原则,我应该将捕获放在所有3个第一个方法中,而不是只放在第一个方法中 Method1() { Method2(); } Method2() { Method3(); } Method3() {

我正在尝试使用最佳的异常处理实践,但我有点迷失了方向

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

假设我在第四个方法中抛出了一个错误。我需要在第三节课上接住它还是我可以在第一节课上接住它

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

Method1()
{
    Method2();
}

Method2()
{
    Method3();
}

Method3()
{
    Method4(); 
}

Method4()
{
    //Some code that could throw a customException
}
我正在尝试使用最佳的异常处理实践,但我有点迷失了方向

编写健壮的软件很难

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

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

在哪里可以正确处理异常?这完全取决于(1)异常和(2)您打算如何处理它。这听起来是个毫无帮助的建议,但你的问题却非常模糊!让我们把例外排除在外,只考虑计算。计算的最佳地点在哪里?早一点计算好还是晚一点计算好?对于所有可能的计算,你怎么可能回答这个问题

我只是想避免在我的所有方法中捕捉到相同类型的错误,这样我就可以在我的大方法中捕捉到错误了

让我们想想这个。为了论证起见,假设每个方法处理异常都是正确的。在什么情况下,将异常处理移出每个被调用方并移入调用方是正确的?这很容易列举:

  • 处理程序不能依赖于仅被调用方而非调用方已知的任何状态
  • 处理程序必须在每个被调用方中执行相同的操作
  • 不得从调用者以外的任何地方调用被调用者
这就是你的处境吗?然后,可以在不改变语义的情况下将处理程序移动到调用方中,从而减少重复的代码

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

然后将处理程序放在尽可能靠近Main的位置

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


我注意到,如果你的应用程序像这样异常关闭,你不能保证你的日志系统不是爆炸的东西,你可能会再次爆炸。小心

不应“尽快捕获”异常,应在适当处理时捕获异常。我想知道“尽快”原则的来源。请提供链接。是的,这是来自其他语言的程序员常见的误解(特别是Python,它将异常用于控制流,Java命令您处理异常或在方法签名中显式声明它们)但在c#中,您不应该将异常用于控制流——它们应该(通常)使用由某种类型的“捕获所有”记录器处理,该记录器将通知您程序中存在错误。@KirkWoll--这取决于异常的类型。如果它是预期的(例如,您尝试写入一个文件,但它被锁定),则您只需捕获它并在catch块中处理它。这不是“错误”。所提到的“我正在卸载appdomain,因为我得到了一个未处理的异常”事件应该是,如果我理解正确的话。