在VB.NET中,如果从Catch
返回值,Finally
代码是否仍会执行?
例如(我稍微概括了这段代码):
Try
response = Client.doRequest()
Catch ex As Exception
'Request threw an error - Fatal failure.
InsertErrorLog(ex)
Return False
Finally
DisposeClient()
End Try
我需要确保DisposeClient()
始终执行。因为我要退出Catch
,Finally
是否仍会被执行?
答案 0 :(得分:9)
Finally
阻止,无论代码是否执行到 Catch
阻止。
请参阅:https://msdn.microsoft.com/en-us/library/fk6t46tz.aspx
尝试使用此代码:
Dim Temp As String
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Temp = "A"
MessageBox.Show(Test())
MessageBox.Show(Temp)
End Sub
Private Function Test() As String
Try
Temp = "B"
Throw New Exception()
Temp = "C"
Return "Try"
Catch ex As Exception
Temp = "D"
Return "Catch"
Finally
Temp = "E"
End Try
Temp = "F"
Return "End"
End Function
显示消息:
Catch
然后再
E
这意味着,即使函数在 Finally
块处返回,也始终会执行 Catch
块。
答案 1 :(得分:1)
仔细检查Microsoft MSDN文档后,我注意到:
无论如何,控制都会传递到最终块 尝试 ... Catch 阻止退出。
即使您的代码遇到返回,最终块中的代码也会运行 尝试或 Catch 块中的语句。
控件未从尝试或 Catch 块传递到相应的 最终在以下情况下阻止:
- 尝试或 Catch 块中遇到结束声明。
- 尝试或 Catch 块中会抛出 StackOverflowException 。
简而言之,是的 - 最终始终在大多数案件中执行。