【发布时间】: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,但是需要采取哪种方式来解决这个问题,实际上这种策略是否会奏效取决于手头问题的具体情况。