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

3 回答 3

18

你不能returnfinally. 你会得到编译器错误:

控制不能离开 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()如果需要/可能,会打电话给你。

于 2011-08-26T15:51:40.930 回答
17

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


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

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

另请参阅此处从 try catch finally 块中返回是不好的做法吗?

于 2011-08-26T15:52:33.933 回答
0

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

于 2011-08-26T15:53:06.613 回答