最终回归尝试和捕获与回归?

Chu*_*ros 12 c# return finally try-catch

这些风险中的任何一个都有风险吗?一个更好吗?或者它是你打印出来并投掷飞镖决定的东西之一?

我想这样做,因为我明白了最终的工作方式:

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

但我见过:

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

aba*_*hev 17

你不能return来自finally.您将收到编译器错误:

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


如果目标类实现,IDisposable那么我会做下一步:

using (stuff s = new stuff())
{
    return stuff;
}
Run Code Online (Sandbox Code Playgroud)

要么

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

Dispose()如果需要/可能的话会打电话给你.

  • @ user540903:嗯,是的,你应该编译它.但是不要把自己打得太厉害; 有些语言从最终返回是合法的,因此这些语言有一些非常奇怪的控制流语义.这是一个合理的问题,只是不适用于C#. (2认同)

Tim*_*mes 17

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


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

同样在finally语句中,检查是否需要关闭/处理对象,因为它们可能从未打开/设置,如果它们已经失败.

另见这里从try catch finally块返回是不好的做法?