为什么在 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
语句是可访问的。
干杯。
这是我的代码。我有一个删除 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
语句是可访问的。
干杯。