【问题标题】:Return in try & catch versus return in finally?在 try & catch 中返回与在 finally 中返回?
【发布时间】:2011-11-04 15:51:12
【问题描述】:

其中任何一种都有风险吗?一个更好吗?或者它是您打印出来然后投掷飞镖来决定的事情之一?

我现在想这样做,因为我了解了 finally 的工作原理:

try { 
    stuff that changes something... 
}
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
}
finally { 
    stuff.close();
    return something; 
}

但我见过:

try { 
    stuff that changes something...
    return something; 
}
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
    return something; 
}
finally { 
    stuff.close(); 
}

【问题讨论】:

  • @Dlev - 除了第一个不是有效的 C#,因此无法完成。那么如何才能更好呢?这个问题真的应该再问一次,任何代码实际上都是有效的代码,否则它就毫无意义。
  • @Ramhound 哎呀,我的意思是前者不是合法的 C#。后者在语法上实际上是有效的。

标签: c# try-catch return finally


【解决方案1】:

您不能从finally 发送return。你会得到编译器错误:

控件不能离开 finally 子句的主体


如果目标类实现了IDisposable,那么接下来我会做:

using (stuff s = new stuff())
{
    return stuff;
}

using (stuff s = new stuff())
{
    try
    {
        // do stuff
        return stuff;
    }
    catch (Exception ex)
    {
        // do logging or another stuff
        return something;
    }
}

如果需要/可能,将为您致电Dispose()

【讨论】:

  • 噢!下次问之前先编译试试,Self!控制不能离开 finally 是有道理的,因为 finally 在要求注意力方面是如此独特。
  • @user540903:嗯,是的,你应该编译它。但是不要把自己打得太厉害;有些语言的最终返回是合法的,因此这些语言具有一些非常奇怪的控制流语义。一般而言,这是一个合理的问题,但不适用于 C#。
  • @Eric 我很漂亮 Java 是其中一种语言。据我回忆,最近的return 会覆盖之前的任何try { throw new BlahException(); } catch { return 1; } finally { return 2; },因此实际上会向调用者返回2
  • @dlev:对。 JavaScript 还允许从 finally 以相同的语义返回;最后返回获胜。
【解决方案2】:

就我个人而言,我两者都不会,并且会使用


try { 
    stuff that changes something... 
}
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
}
finally { 
    stuff.close();    
}
return something; 

同样在finally 语句中,检查您是否需要关闭/处置对象,因为如果它们失败,它们可能永远不会被打开/设置。

另见此处Is it bad practice to return from within a try catch finally block?

【讨论】:

  • 我同意这一点,因为 abatishchev 说你不能在 finally 中返回,我认为你不应该在 catch 中返回。如果你有一个 try catch 并且不重新抛出,你希望它以任何一种方式返回,如果你重新抛出,那么它无论如何都不会返回。无论哪种方式,您只需要 1 个返回语句而不是 2 个
  • 从 try/catch/finally 中返回不被视为“结构化编程”。我同意蒂姆和本的观点。
【解决方案3】:

第二种方法没有风险。但它允许您在出现异常时返回不同的值。

【讨论】:

  • 在 try 和 catch 块中返回一个变量并将其设置为不同的值也是如此,但在整个 try/catch 块之外只有 1 个返回。
  • 返回一个变量的值也可以让你在异常的情况下返回不同的值。
猜你喜欢
  • 2014-04-27
  • 2015-10-24
  • 2016-03-28
  • 2012-02-10
  • 2018-11-05
  • 2021-05-30
  • 2010-11-09
  • 2017-07-20
  • 2014-12-26
相关资源
最近更新 更多