跳到最后没有调用返回

时间:2011-11-29 13:45:39

标签: c#

在C#中(当使用try / finally时)如何在不调用return的情况下跳转到finally部分。

例如:

public bool SomeMethod()
{
    try
    {
        ...
        if (...)
        {
            ---> Jump to finally
        }
        else
        {
            ...
        }

        ...

        if (...)
        {
            ---> Jump to finally
        }
        else
        {
            ...
        }
        ...
        return true;
    }
    finally
    {
        ...

        if (...)
            return true;
        else
            return false;
    }

}

如何强制跳转到finally部分(不使用return)?

修改

我要做的是:

public bool SomeMethod(ref string Error)
{
    try
    {
        bool result = false;

        if (...)
            ---> Exit to Finally
        else
            ...

        ...

        if (...)
            ---> Exit to Finally
        else
            ...

        ...

        --> more of the above kind of IFs

        return true;
    }
    finally
    {
        ...

        if (!result)
        {
                LogAMessage("");
                ...
                Error = "...";
                ...
        }
        return result;
    }

}

4 个答案:

答案 0 :(得分:6)

您可以使用标签和goto

然而,这似乎表明您的功能可能不够好。

在这种情况下,您似乎使用finally作为函数 - 为什么不将该逻辑提取到自己的函数中?

答案 1 :(得分:1)

你真的不应该这样做......

考虑以一种方式重写代码,这意味着goto - >最后不是要求。

也许将finally块中的代码拉出一个方法并在多个地方调用它......

<强>更新

您可以通过以下方式获得所需的行为:

public bool SomeMethod(ref string Error)
{
  bool result = false;
  try
  {
    if (...)
    {
        return result;
    }
    else
    {
        result = true;
        ...
        return result;
    }
}
finally
{
    if (!result)
    {
            LogAMessage("");
            ...
            Error = "...";
            ...
    }
}

但是,要实现这一目标,您应该查看Delegation Pattern以获得更清晰的方法来实现此日志记录。

答案 2 :(得分:1)

您有几个选择:

  • 在try / finally块的内部或外部添加一个虚拟块,并使用 break

    // dummy block inside
    try {
        do {
            ...
            if (condition)
                break;
            ...
        } while (false);
    } finally {
        ...
    }
    
    // dummy block outside
    do {
        try {
            ...
            if (condition)
                break;
            ...
        } finally {
            ...
        }
    } while (false);
    
  • 在finally块前添加标签并使用转到(请注意,建议不要使用goto)。

  • 将您的区块放入单独的方法中,以便您可以使用返回而不离开外部方法。

答案 3 :(得分:0)

也许可以考虑将此方法放在实现IDisposable的类中。

然后你可以调用这个方法,同时它包含一个using语句,并保证被清除。