如果我捕获所有异常;
try
{
... //code causes error
}
catch (Exception e)
{
...//handle all exceptions
}
那么,既然我捕获了所有异常,程序将继续执行try-catch后的代码,那么就没有必要使用Finally块了吗?
另一个问题是,如果使用finally块,如何捕获在最终块本身中发生的错误?我的意思是看起来我们只需要将所有内容放在最后的try和catch块中就可以了吗?
finally
子句与您捕获哪些异常、如何捕获以及捕获多少异常几乎没有关系。将放置在finally
子句中的代码视为必须独立运行的清理代码,无论try
子句内发生了什么。一个典型的场景是以下情况(我会使用一些C#7来增加乐趣):(bool Succesful, object Result) TryDoSomethingDangerous()
{
var someDisposableObject = new SomeDisposableObject();
try
{
var result = someDisposableObject.DoSomethingDangerous(); //documented to be able to throw SomethingBadHappenedException
return (true, result);
}
catch (SomethingBadHappenedException e)
{
Logger.Log(e);
InformUserSomethingWentWrong(e);
return (false, null);
}
finally
{
someDisposableObject.Dispose();
}
}
catch (System.Exception)
是一个坏主意。try-catch-finally
的执行流程。finally块中的代码是必须运行的,无论try语句中发生了什么。你似乎认为这是只有在有异常时才应该运行的代码。finally
语句块中的代码应该是健壮的,并且不会自己抛出异常。如果在特定情况下,这是不可能的,那么finally
语句块中的代码将需要有自己的异常处理机制。在我的情况下,我试图避免这种情况,并相应地重构代码。finally
实际上是 CLR 中存在但在 C# 中没有暴露的 fault
。 - Damien_The_Unbeliever
catch (Exception e)
不是一个好主意。 - Jonathon Reinhartfinally
中捕获错误,你需要另一个try-catch
。 - koceeng