可以两个或更多的'try/catch'语句共享'finally'语句

本文关键字:语句 try catch finally 共享 两个 | 更新日期: 2023-09-27 18:14:59

在c#中两个或多个'try/catch'语句可以共享'finally'语句吗?我正在试着遵循一个同事的代码,它非常草率和不可执行。

的例子:

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

可以两个或更多的'try/catch'语句共享'finally'语句

finally仅适用于示例中的最后一个 try

拥有空的catch块也不是一个好主意,因为它类似于吞食虫子。

不,每个try/catch/finally序列是一个离散的块级语句。然而,每个try可以有零,一个或多个 catch子句,后跟一个可选的finally子句。

查看代码,我看不出有什么令人信服的理由不写成:

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

正如jord提到的,空(未注释的)catch处理程序是一种糟糕的做法。如果您希望它们都由相同的finally块处理,则没有理由将各种函数调用拆分为单独的try块。

当然。在try/catch语句中加上try/finally语句

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

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

如果你期望从每个调用中得到特定的异常,你可以链接你的catch语句

try
{
 Function1();
 Function2();
 Function3();
} catch(Func1Exception e1) {
} catch (Func2Exception e2) {
} catch (Func3Exception e3) {
} finally {
  //shared finally
}

另一个选项是使用an来跟踪哪个函数执行了

var functionExecuted = -1;
try
{
 Function1();
 functionExecuted = 1;
 Function2();
 functionExecuted = 2;
 Function3();
 functionExecuted = 3;
} catch(Exception e) {
} finally {
  // functionExecuted indicates the last executed function
}

另一个选项是编写一个finally函数,从单个的finally函数调用——但这让我觉得很奇怪。