Tenta ... apanhar ... finalmente dentro VB.NET
em VB.NET, se você devolver um valor do Catch
, o código Finally
ainda será executado?
por exemplo (eu generalizei este código um pouco):
Try
response = Client.doRequest()
Catch ex As Exception
'Request threw an error - Fatal failure.
InsertErrorLog(ex)
Return False
Finally
DisposeClient()
End Try
Preciso de garantir que DisposeClient()
é executado o tempo todo. Porque eu estou voltando do Catch
, o Finally
ainda será executado?
3 answers
Finally
o bloco é sempre executado, independentemente de a execução do Código ir para Catch
com ou sem bloco.
Ver: https://msdn.microsoft.com/en-us/library/fk6t46tz.aspx
Tenta, usando este código:
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
Mostra a mensagem:
Catch
E depois
E
Isto significa, Finally
o bloco é sempre executado até mesmo a função retorna em Catch
block.
Sobre uma inspecção mais próxima dos documentos Microsoft MSDN, reparei:
O controlo é passado para o bloco Finalmente independentemente de como o tenta ...capturas saídas do bloco.
O código num finalmente funciona mesmo que o seu código encontre um retorno declaração num bloco tentar ou capturar.
O controlo não passa de um bloco tentar ou capturar para o bloco correspondente Finalmente assinalar os seguintes casos:
- a Declaração de fimé encontrada no bloco tentaou Captura.
- a StackOverflowException é atirada para o bloco Try or Catch.
Em resumo, Sim - O Finalmente é sempre executado em a maioria dos casos.