为什么在 try-finally 之后无法访问我的 return 语句?

why is my return statement unreachable after try-finally?

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

我正在 returning 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.
}

这是为什么?难道我不必 return 在此方法中有一些价值。

感谢您的见解。

你没有捕获,所以如果在你的尝试中出现异常,它就会被抛出。您的方法要么成功并且 returns 为真,要么抛出异常。

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

您只需在 finally 之前添加 catch {} 即可吞下异常(如果这是您想要的)。

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

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

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

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

干杯。