【问题标题】:C# Exception Handling - will last catch block fetch re-thrown Exception?C# 异常处理 - 最后捕获块获取重新抛出异常吗?
【发布时间】:2021-10-22 13:42:31
【问题描述】:

我想知道这段代码是否会以在 10 次重试后调用 CleanUp() 的方式工作?还是 throw new Exception() 不会被最后一个 catch 块捕获?

public void Process()
{
    try
    {}
    catch (MyException e)
    {           
        int retries = GetRetries();
        if(retries > 10)
        {
            _logger.LogError("Retried event already {retries} times. Giving up.", retries);
            throw new Exception("Giving up!");
        }

        Process();

    }
    catch (Exception e)
    {
        CleanUp();
    }
}

【问题讨论】:

  • 如果您想知道运行代码时会发生什么,那么运行代码 看看会发生什么。你为什么要问我们你的代码在运行时做了什么?
  • 不要对正常的控制流使用异常
  • 因为代码比这复杂得多,要创建实际条件需要一些努力。因此,我试图尽可能简化这一点。希望一般问题很清楚。
  • @silent 我认为你不需要复杂的代码来测试这个 - try it out
  • 如果你想重试Process,那么你需要有一个循环,其中包含一个围绕Process 的尝试,一旦你达到重试阈值就会抛出一个catch。然后,您可以尝试使用 CleanuUp 来解决所有这些问题(或者如果更有意义,可以使用 finally)。一个空的try 是没有意义的,除非你只是为了简洁而没有在你的try 中显示代码。

标签: c# exception


【解决方案1】:

不,它不是那样工作的。对于任何给定的try/catch 块,只有源自try 的异常才能被相应的catch 块捕获。在catch 块中抛出的异常不能被同级别的其他catch 块捕获。

finally 块允许您在控制因任何原因离开try/catch 时运行代码。因此,如果您的 try 末尾已经有一个 CleanUp,那么您只需将您的最终 catch(Exception e) 更改为 finally 并删除 try 部分末尾的 CleanUp

但是,如果您只想在控制离开try/catch 时运行CleanUp通过异常,您就没有那么幸运了。 IL 中有一个fault 子句,即finally,但仅用于异常,但在 C# 中并未公开。

因此,如果您需要,通常最好引入一个额外的bool,以指示您毫无例外地到达了try 块的末尾,并使用它来使您的CleanUp 调用在finally 中有条件.


或者你可以通过嵌套try/catch块来模拟try/catch/fault

try
{
    try
    {}
    catch (MyException e)
    {           
        int retries = GetRetries();
        if(retries > 10)
        {
            _logger.LogError("Retried event already {retries} times. Giving up.", retries);
            throw new Exception("Giving up!");
        }

        Process();

    }
}
catch
{
  //Act as fault
  CleanUp();
  throw;
}

【讨论】:

  • 谢谢,这正是我想要澄清的。
  • 正如所写的,这段代码不会做任何事情,因为内部try 是空的,因此不会抛出,所以内部catch 永远不会运行,因此外部try 不会发生异常并且外部的catch 也不会运行。我怀疑 OP 真的想要 Process 周围的 try 如果这是重试代码。
  • @juharr - 是的,我将其视为“为简洁起见省略了try 的内容”。空的 try 块毫无意义。
猜你喜欢
  • 2010-11-06
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2013-06-24
  • 2011-10-10
相关资源
最近更新 更多