如果我抓住了所有的例外;
try
{
... //code causes error
}
catch (Exception e)
{
...//handle all exceptions
}
所以没有必要使用finally block?由于我捕获了所有异常,程序将在try catch之后继续执行代码?
另一个问题是,如果使用finally块,如何捕捉finally块本身发生的错误?我的意思是看起来我们只需要把所有的东西都放在最后一个试抓块里?
最佳答案
所以没有必要使用finally block?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();
}
}
由于我捕获了所有异常,程序将在try catch之后继续执行代码?
这令人担忧。是的,如果捕捉到所有异常,则代码将继续运行(任何人都能猜到多长时间),但通常这是一个非常糟糕的主意。您应该只处理您知道如何修复和恢复的异常。吞下例外只是为了继续跋涉注定会以灾难告终。
一般来说,
catch (System.Exception)
是个坏主意,除非您打算简单地记录信息并立即重新抛出。另一个问题是,如果使用finally块,如何捕捉finally块本身发生的错误?我的意思是看起来我们只需要把所有的东西都放在最后一个试抓块里?
同样,您完全误解了
try-catch-finally
中的执行流程。finally
中的代码是无论try子句中发生什么都必须运行的代码。您似乎认为只有在出现异常时才应该运行代码。一般来说,如果
finally
子句中的代码是健壮的,并且本身不抛出异常,则更好。如果在这种情况下,这是不可能的,那么finally
子句中的代码将需要有自己的异常处理机制。在我的例子中,我试图避免这种情况,并相应地重构代码。