C# 返回try&;最后是捕获还是返回?

C# 返回try&;最后是捕获还是返回?,c#,try-catch,return,finally,C#,Try Catch,Return,Finally,这两种方法中的任何一种都有风险吗?有更好的吗?或者这是你打印出来,然后掷镖决定的事情之一 现在我想这样做,因为我了解了最终的工作原理: try { stuff that changes something... } catch (System.Exception ex) { something.worked = false; something.err = ex.Message; } finally { stuff.close(); retur

这两种方法中的任何一种都有风险吗?有更好的吗?或者这是你打印出来,然后掷镖决定的事情之一

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

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(); 
}

您不能从
最后返回
。您将得到编译器错误:

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


如果目标类实现了IDisposable

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


如果需要/可能的话,我将为您调用
Dispose()

就我个人而言,我不会这样做,也不会使用


try { 
    stuff that changes something... 
}
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
}
finally { 
    stuff.close();    
}
return something; 
另外,在
finally
语句中,检查是否需要关闭/处置对象,因为如果对象失败,它们可能从未被打开/设置过


另请参见此处

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

我同意这一点,因为abatishchev说您不能在finally中返回,我认为您不应该在catch中返回。如果你有一个试捕,但你不想再抓它,你希望它返回任何一种方式,如果你再抓,那么它将永远不会回来。无论哪种方式,您只需要1个return语句,而不需要2个try/catch/finally中的return语句,这都不被视为“结构化编程”。我同意Tim和Ben的观点。在try和catch块中返回一个变量并将其设置为不同的值,但在整个try/catach块之外只有一个返回。返回变量的a值也可以在异常情况下返回不同的值。Doh!在你问下一次之前试着编译,赛尔夫!控件不能留下finally是有道理的,因为finally在吸引注意力方面是如此独特。@user540903:是的,您应该编译它。但不要把自己打得太厉害;有些语言的finally返回是合法的,因此这些语言具有一些非常奇怪的控制流语义。一般来说,这是一个合理的问题,只是不适合C语言。@Eric I'm pretty Java就是其中之一。据我回忆,最近的
return
会覆盖以前的任何一个,因此
尝试{throw new BlahException();}catch{return 1;}最后{return 2;}
实际上会向调用方返回一个
2
。@dlev:对。JavaScript还允许finally以相同的语义返回;最后一次返回获胜。@Dlev-但第一次返回无效,因此无法执行。那怎么可能更好呢?这个问题真的应该再问一遍,任何代码实际上都是有效代码,否则就毫无意义了。@Ramhound Oops,我的意思是前者不是合法的C#。后者实际上在语法上是有效的。

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