2011-08-26 52 views
12

这些风险是其中之一吗?更好吗?或者这是你打印出来的东西之一,并投掷飞镖决定?返回try&catch与return in 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(); 
} 
+1

@Dlev - 除了第一个是无效的C#,所以它不能完成。那么它怎么会更可取?这个问题真的应该再次提出,其中任何代码实际上是有效的代码,否则它的意义就没有意义。 –

+0

@Ramhound糟糕,我的意思是前者不合法的C#。后者在语法上实际上是有效的。 – dlev

回答

17

你不returnfinally可以。你会得到编译器错误:

Control cannot leave the body of a finally clause


如果目标类实现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()你被要求/可能。

+0

Doh!在下次问你之前试着编译,Self!控制不能离开终点是有道理的,因为终于在要求的关注中如此独特。 – ChuckNeuros

+2

@ user540903:好的,你应该编译它。但不要打得太厉害,有些语言从finally中返回是合法的,因此这些语言有一些非常奇怪的控制流语义。一般来说这是一个合理的问题,而不是C#。 –

+0

@Eric我很漂亮Java是其中的一种语言。从我记得,最近的'return'覆盖任何以前的,所以'尝试{抛出新的BlahException(); } catch {return 1; } finally {return 2; }'实际上给调用者返回一个'2'。 – dlev

17

个人而言,我会做既不并会使用


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?

+1

我同意这一点,因为abatishchev说你不能在最后回来,我认为你不应该有回报。如果你有一个尝试,并不重新抛出,你希望它以任何方式返回,如果你重新抛出,那么它永远不会返回。无论哪种方式,你只需要1个return语句,而不是从try/catch/finally中返回的2 –

+1

不被视为“结构化编程”。我同意蒂姆和本。 –

0

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

+1

因此,返回一个变量并将它设置为try和catch块中的不同值,但只在整个try/catach块外返回1个变量。 –

+0

返回一个变量的值也会让你在异常情况下返回不同的值。 –