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

5

如果我捕获所有异常;

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

那么,既然我捕获了所有异常,程序将继续执行try-catch后的代码,那么就没有必要使用Finally块了吗?

另一个问题是,如果使用finally块,如何捕获在最终块本身中发生的错误?我的意思是看起来我们只需要将所有内容放在最后的try和catch块中就可以了吗?


1
是的,但通常使用catch (Exception e)不是一个好主意。 - Jonathon Reinhart
如果你想在finally中捕获错误,你需要另一个try-catch - koceeng
这里接受的答案:https://dev59.com/zXRB5IYBdhLWcg3wtJCF#547806 很好地解释了它。 - nawfal
2个回答

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块,如何捕获发生在finally块本身中的错误?我的意思是看起来我们只需要把所有东西放在最后的try和catch块中?
同样,你完全误解了try-catch-finally的执行流程。finally块中的代码是必须运行的,无论try语句中发生了什么。你似乎认为这是只有在有异常时才应该运行的代码。
通常情况下,在finally语句块中的代码应该是健壮的,并且不会自己抛出异常。如果在特定情况下,这是不可能的,那么finally语句块中的代码将需要有自己的异常处理机制。在我的情况下,我试图避免这种情况,并相应地重构代码。

是的,这个 OP 似乎认为 finally 实际上是 CLR 中存在但在 C# 中没有暴露的 fault - Damien_The_Unbeliever

1

enter image description here

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

1
我们需要一张图来说明“finally块总是被执行”吗? :) - Rob
抱歉,我的英语不太好。 - Fatih Topcu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接