让我们说我必须捕获3个不同的异常,所以我写了3个单独的catch块。但我想跳过一个特定异常的finally块。
据我所知,使用内置标志是不可能的。但是你能告诉我如何以优雅的方式解决这个编码问题吗?
当不使用finally时,我必须多次重写相同的代码,在try和其他catch块中。
更多信息:
最后我让线程睡了一段时间(await Task.Delay(5 * 1000);
)
但是,如果我收到OperationCanceledException
,那么我就不希望最终运行。我希望它能尽快打破。
while (true)
{
try
{
_cts.Token.ThrowIfCancellationRequested();
}
catch (OperationCanceledException)
{
break;
}
catch (CustomException1 e)
{
}
catch (CustomException2 e)
{
}
finally
{
await Task.Delay(5 * 1000);
}
}
答案 0 :(得分:6)
如果不采取任何措施,则在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
}
}
答案 1 :(得分: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
的时间点要保证始终运行,无论抛出任何异常。