【问题标题】:Skip finally in a specific catch最后在特定的捕获中跳过
【发布时间】:2017-10-24 15:16:22
【问题描述】:

假设我必须捕获 3 个不同的异常,所以我编写了 3 个单独的 catch 块。但我想为一个特定的异常跳过 finally 块。

据我所知,使用内置标志是不可能的。但是你能建议如何以优雅的方式解决这个编码问题吗?

当不使用 finally 时,我必须多次重写相同的代码,在 try 和其他 catch 块中。

更多信息: 最后我让线程休眠了一段时间(await Task.Delay(5 * 1000);) 但是,如果我收到 OperationCanceledException然后我不希望 finally 运行。我希望它尽快断裂。

while (true)
{
    try
    {
        _cts.Token.ThrowIfCancellationRequested();
    }
    catch (OperationCanceledException)
    {
        break;
    }
    catch (CustomException1 e)
    {

    }
    catch (CustomException2 e)
    {

    }                
    finally
    {
        await Task.Delay(5 * 1000);
    }
}

【问题讨论】:

  • 那么finally就不要用了
  • 在 catch 块外创建一个布尔值,设置为 false。然后在您的特殊 catch 块中将其设置为 true 并最终检查布尔值。不明白你为什么要这样做
  • 我同意蒂姆的观点,你试图避免使用 finally 的唯一目的,所以不使用它是有道理的。 stackoverflow.com/questions/13545230/… 我能想到的唯一解决方案是在 finally 块内有类似 if 语句的某种期望并从那里返回特定结果。
  • 也许你想问别的?因为问题的当前状态没有意义。
  • 这听起来像是“其中一个与其他的不一样” - 可以通过嵌套两个 try/catch 块来解决这个问题,其中只有一个有 finally,但是需要采取哪种方式来解决这个问题,实际上这种策略是否会奏效取决于手头问题的具体情况。

标签: c# try-catch


【解决方案1】:

似乎您可以使用异常过滤器来过滤所有应该有一些整洁代码的异常和一个没有的异常。

try
{
    DoSomething();
}
catch(Exception e) when (e is MyException || e is AnotherException)
{
    // your error-handling
    // ...
    await Task.Delay(5 * 1000);
}
catch(SpecificExceptionWithoutFinally e)
{
    ...
}

在 C#6 之前,您还可以引入一些标志来指示是否应该执行代码:

var executeFinally = false;

try
{
    DoSomething();
}
catch(MyException e) 
{
    executeFinally = true;
}
catch(AnotherExceptione)
{
    executeFinally = true;
}    
catch(SpecificExceptionWithoutFinally e)
{
    ...
}
finally
{
    if(executeFinally) {
        await Task.Delay(5 * 1000);
    }
}

无论如何,这似乎是一个奇怪的要求,因为finally 的全部意义在于保证始终运行,而不管抛出任何异常。

【讨论】:

    【解决方案2】:

    如果什么都不做,在 finally 块中什么也不做

    bool skipFinallyFlag = false;
    try
    {
        //My stuff
    }
    catch(Exception1 ex1)
    {
        //Do something
    }
    catch(Exception2 ex2)
    {
        //Do something
    }
    catch(Exception3 ex3)
    {
        skipFinallyFlag = true;     
    }
    finally
    {
        if(!skipFinallyFlag)
        {
            //Do something
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-21
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多