【问题标题】:no need to use finally in try catch block if catching all exceptions? [duplicate]如果捕获所有异常,则无需在 try catch 块中使用 finally? [复制]
【发布时间】:2017-01-13 00:19:01
【问题描述】:

如果我捕获所有异常;

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

那么就不用Finally块了吧?既然我catch了所有的异常,那么try-catch之后程序还会继续执行代码吗?

另一个问题是,如果使用 finally 块,我如何才能捕捉到 final 块本身发生的错误?我的意思是看起来我们只需要将所有内容都放在最后的 try 和 catch 块中吗?

【问题讨论】:

  • 是的,但catch (Exception e) 通常是个坏主意。
  • 如果你想在finally 中捕获错误,你需要另一个try - catch
  • 这里接受的答案:stackoverflow.com/a/547806 解释得很好。

标签: c# exception exception-handling


【解决方案1】:

那么就不用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();
    }
}

既然我catch了所有的异常,那么try-catch之后程序还会继续执行代码吗?

这令人担忧。是的,如果您捕获所有异常,您的代码将继续运行(任何人都在猜测),但总的来说,这是一个非常糟糕的主意。您应该只处理您知道如何修复和恢复的异常。吞并异常只是为了继续跋涉,注定会以灾难告终。

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

另一个问题是,如果使用 finally 块,我如何才能捕捉到 final 块本身发生的错误?我的意思是看起来我们只需要将所有内容都放在最后的 try 和 catch 块中吗?

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

一般来说,如果finally 子句中的代码是健壮的并且本身不会引发异常,那就更好了。如果在这种情况下这是不可能的,那么finally 子句中的代码将需要有自己的异常处理机制。就我而言,我尽量避免这种情况并相应地重构代码。

【讨论】:

  • 是的,OP 似乎认为 finally 实际上是 fault,它存在于 CLR 中但未在 C# 中公开。
【解决方案2】:

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

【讨论】:

  • 我们是否需要一个图表来说明“最终块总是被执行”? :)
  • :) 我的英语很差
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多