如果我发现所有异常;
try
{
... //code causes error
}
catch (Exception e)
{
...//handle all exceptions
}
所以没有必要使用Finally块?因为我捕获所有异常,程序将继续在try-catch之后执行代码?
另一个问题是,如果使用finally块,我怎样才能捕获最终块本身发生的错误?我的意思是看起来我们只需要把一切都放在最后的try和catch块中?
答案 0 :(得分:3)
所以没有必要使用Finally块?
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块,我怎样才能捕获最终块本身发生的错误?我的意思是看起来我们只需要把一切都放在最后的try和catch块中?
同样,您完全误解了try-catch-finally
中的执行流程。 finally
中的代码是必须运行的代码,无论try子句中发生什么。您似乎相信它的代码只有在出现异常时才会运行。
一般情况下,如果finally
子句中的代码是健壮的并且本身不会抛出异常,则会更好。如果在某种情况下,这是不可能的,那么finally
子句中的代码将需要有自己的异常处理机制。在我的情况下,我试图避免这种情况并相应地重构代码。
答案 1 :(得分:1)