【问题标题】:why is my return statement unreachable after try-finally? [duplicate]为什么我的 return 语句在 try-finally 之后无法访问? [复制]
【发布时间】:2019-12-21 06:45:51
【问题描述】:

这是我的代码。我有一个删除 Azure Block Blob 的方法。我有一个 try / finally 块来记录失败的详细信息,否则继续。

我返回一个bool 来确定该项目是否已被删除。

Visual Studio 告诉我方法末尾的 return 语句无法访问。

public bool Delete(string referenceId)
{
    var client = GetBlobClient();
    var container = client.GetContainerReference("qwerty");
    var blob = container.GetBlockBlobReference(referenceId);
    try
    {
        blob.Delete();
        return true;
    }
    finally
    {
        Trace.TraceWarning("Delete Blob failed: {0}", referenceId);
    }
    return false;  // <-- THIS LINE.
}

这是为什么呢?我不必在此方法中返回一些值。

感谢您的洞察力。

【问题讨论】:

  • 对不起,伙计。我只是想更好地理解语言。

标签: c# unreachable-code


【解决方案1】:

你没有捕获,所以如果你的尝试中有异常,它就会被抛出。您的方法要么成功并返回 true,要么抛出异常。

如果您添加一个 catch 块,警告将消失,因为该路径现在可以访问。

您应该能够通过在 finally 之前添加 catch {} 来处理异常(如果这是您想要的)。

更仔细地查看您的代码,您可能希望将 finally 替换为 catch 无论如何 - 无论结果如何,您都不太可能希望记录删除失败。

【讨论】:

  • 我最初删除了catch 以尝试确定如果删除失败我会得到什么样的异常......并且我从未替换它。感谢您的快速回复。
【解决方案2】:

由于try 块中的return 语句,代码无法访问,除非抛出exception,否则该语句将始终执行。

如果blob 变量的Delete() 方法无缝执行,那么try 块中的return 语句将被执行并且该方法将退出(在finally 块运行之后)而不执行任何try/finally 块之后的进一步指令。否则,如果它抛出一个exception,那么exception 本身将传播到调用者方法(同样,在finally 块运行之后)并且return 语句都不会被执行。无论哪种情况,都不会到达方法末尾的return 语句。

但是,如果您删除 try 块中的 return 语句,您将验证代码仍然成功编译,并且方法末尾的 return 语句是可访问的。

干杯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2020-06-17
    • 2012-06-25
    相关资源
    最近更新 更多