如果捕获所有异常,不需要在try catch块中使用finally吗?

时间:2017-01-13 00:19:01

标签: c# exception exception-handling

如果我发现所有异常;

try
{
    ... //code causes error
}
catch (Exception e)
{
   ...//handle all exceptions
}

所以没有必要使用Finally块?因为我捕获所有异常,程序将继续在try-catch之后执行代码?

另一个问题是,如果使用finally块,我怎样才能捕获最终块本身发生的错误?我的意思是看起来我们只需要把一切都放在最后的try和catch块中?

2 个答案:

答案 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)

enter image description here

在释放资源等情况下,它会被使用两次而不是编写相同的代码(try和catch)。如关闭数据库连接和处理对象