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

C# 如果捕获所有异常,则不需要在try-catch块中使用finally?,c#,exception,exception-handling,C#,Exception,Exception Handling,如果我抓住了所有的例外 try { ... //code causes error } catch (Exception e) { ...//handle all exceptions } 所以没有必要使用Finally块?由于我捕获了所有异常,程序将在try-catch之后继续执行代码 另一个问题是,如果使用finally块,如何捕获finally块本身中发生的错误?我的意思是,看起来我们只需要把所有的东西都放在最后的尝试和捕获块中? 在释放资源等情况下,它会被使用两次,而不是

如果我抓住了所有的例外

try
{
    ... //code causes error
}
catch (Exception e)
{
   ...//handle all exceptions
}
所以没有必要使用Finally块?由于我捕获了所有异常,程序将在try-catch之后继续执行代码

另一个问题是,如果使用finally块,如何捕获finally块本身中发生的错误?我的意思是,看起来我们只需要把所有的东西都放在最后的尝试和捕获块中?

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

所以没有必要使用Finally块

finally
子句与捕获什么、如何捕获以及捕获多少异常关系不大。将
finally
子句中的代码视为清理代码,必须独立于
try
子句中发生的事情运行。一个典型的场景如下(为了好玩,我将使用一些C#7):

由于我捕获了所有异常,程序将在try-catch之后继续执行代码

这令人担忧。是的,如果您捕获了所有异常,您的代码将继续运行(任何人都猜测会运行多长时间),但一般来说,这是一个非常糟糕的主意。您应该只处理您知道如何修复和恢复的异常。仅仅为了继续艰难前行而吞下例外注定以灾难告终

一般来说,
catch(System.Exception)
是个坏主意,除非您计划简单地记录信息并立即重新抛出

另一个问题是,如果使用finally块,如何捕获finally块本身中发生的错误?我的意思是,看起来我们只需要把所有的东西都放在最后的尝试和捕捉区

同样,您完全误解了
try catch finally
中的执行流程。finally中的代码是必须运行的代码,无论try子句中发生了什么。您似乎认为只有在出现异常时才应该运行代码


一般来说,如果
finally
子句中的代码是健壮的,并且本身不抛出异常,则更好。如果在特定情况下,这是不可能的,那么
finally
子句中的代码将需要有自己的异常处理机制。在我的例子中,我试图避免这种情况,并相应地重构代码。

是的,但是
catch(异常e)
通常是个坏主意。如果您想捕获
finally
中的错误,您需要另一个
try
-
catch
我们是否需要一个图表来说明“finally block始终执行”?:)我的英语很差,OP似乎认为
最终
实际上是
错误
,它存在于CLR中,但在C#中没有暴露出来。
(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();
    }
}