如何在C#中将程序流显式传递给finally块?

Wod*_*dzu 0 c# delphi try-catch-finally

在Delphi中,我可以这样做:

try
  if not DoSomething then
    Exit;
  if not DoSomething2 then
    Exit;
  if not DoSomething3 then
    Exit;

finally
  DoSomethingElse;
end;
Run Code Online (Sandbox Code Playgroud)

在其他方法中,如果方法DoSomething结果为假,则程序流被转移到finally块,DoSomething2并且DoSomething3不执行.

如何在C#中实现这种行为?

提前致谢.

Edit1: 以下示例无法在VS 2008中编译

编辑2:对不起,我要快速忘记退货声明;

XElement OrderStatus(q_order_status Request)
{
  XElement Response;
  try
  { 
    if (DoSomething() != 0 )
    {
      return;
    }
  }
  catch(Exception e)
  {
    // catch some errors and eventually pass the e.Message to the Response
  }
  finally
  {
    Response =  new XElement("SomeTag", "SomeResponse");
  }
  return Response;
}
Run Code Online (Sandbox Code Playgroud)

Edit3: 经过测试,似乎最简单的方法是在结果DoSomething1为false时抛出异常.我可以抛出自己的execption,编写一个特定的消息并将其传递给finally子句.

Jor*_*ren 14

你真的不应该使用异常处理结构进行流控制.也就是说,ExitreturnC#相当.关于[return keyword] [1]的MSDN文档说:

如果return语句在try块内,则finally控件(如果存在)将在控制返回调用方法之前执行.

通常,finally如果try已到达相应的块,则几乎总是执行-block.有一些罕见的情况是无法保证finally-block执行,但它们都是致命错误,程序可能会立即崩溃.

您的代码在C#中的外观如何:

try
{
    if (!DoSomething())
        return;

    if (!DoSomething2())
        return;

    if (!DoSomething3())
        return;
}
finally
{
    DoSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

但同样,不要这样做.tryfinally旨在处理异常,而不是正常的流量控制.

回复您的编辑:
在您的代码return不编译,因为该方法的返回类型是XElementreturn自身时返回类型是只能用void.你可以使用return new XElement("SomeTag", "SomeResponse");,因为这是finally将要做的事情,或者你可以Response提前分配和做return Response;.

不过要注意的是,虽然finally总是执行,在return Response;自带之后,在没有执行,如果原因走进了finally-块是因为你做了一个return内部try-阻塞.

  • @mizipor:引用C#语言参考:"finally块对于清理try块中分配的任何资源以及运行任何必须执行的代码都很有用,即使有异常.控件总是传递给finally块而不管尝试块如何退出." (2认同)