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?

Author: FlyingTeller, 2016-02-24

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.

 7
Author: ichan-akira, 2018-04-20 14:16:09

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.

 1
Author: Virtual Anomaly, 2016-02-24 11:05:35
Generalizaste muito o teu exemplo de código. Eu recomendaria usar Usando onde faz sentido. O que ajudará a eliminar as tuas coisas.
 0
Author: Zelxin, 2016-02-24 20:22:36