两个或更多'try / catch'语句可以在C#中共享一个'finally'语句吗?

时间:2011-11-16 21:16:46

标签: c# try-catch

两个或更多'try / catch'语句可以在C#中共享一个'finally'语句吗?我正在尝试遵循同事的代码而且它非常草率且无法执行。

示例:

try
{
    Function1()
}
catch { }
try
{
    Function2();
}
catch { }
try
{
    Function3();
}
catch { }
finally
{
    EndFunction();
}

5 个答案:

答案 0 :(得分:7)

最终版仅适用于您示例中的 last try

拥有空catch块也不是一个好主意,因为它类似于吞噬错误。

答案 1 :(得分:6)

不,每个try/catch/finally序列都是一个离散的块级语句。但是,每个try可以包含 0,一个或多个 catch子句,后跟可选的finally子句。

查看代码,我认为没有令人信服的理由不写成:

try
{
    Function1()
    Function2();
    Function3();
}
finally
{
    EndFunction();
}

正如Jordão所提到的那样,空(未注释)捕捉处理程序是一种可怕的做法。如果您希望它们全部由相同的try块处理,则没有理由将各种函数调用拆分为单独的finally块。

答案 2 :(得分:5)

不确定。只需一次尝试/最终包装try / catch。

try
{
    try
    {
    }
    catch ...
    try
    { }
    Catch ...
 }
 finally 
 {
 }

答案 3 :(得分:2)

不,最后只适用于最后一个try / catch块。

答案 4 :(得分:1)

如果您期望每次调用都有特定的异常,您可以链接您的catch语句

try
{
 Function1();
 Function2();
 Function3();
} catch(Func1Exception e1) {

} catch (Func2Exception e2) {

} catch (Func3Exception e3) {

} finally {
  //shared finally
}

另一个选项是使用a来跟踪已执行的功能

var functionExecuted = -1;
try
{
 Function1();
 functionExecuted = 1;

 Function2();
 functionExecuted = 2;

 Function3();
 functionExecuted = 3;
} catch(Exception e) {

} finally {
  // functionExecuted indicates the last executed function
}

另一个选择是编写一个从个人最后调用的finally函数 - 但这让我觉得很奇怪。