Depois de um tempo programando você começa a criar e fragmentar funções e procedimento para reaproveitá-los. Naturalmente, uma função (nível 1) pode chamar outra (nível 2) que pode chamar outra (nível 3) que pode chamar outra (nível 4)... e por aí vai. Todavia, quando um erro ocorre nesse emaranhado de funções como o código deve proceder?
Quando um erro ocorre, o VBA perdoa fácil. Isto é, o VBA procura o primeiro tratamento de erro existente e faz o que tem que fazer, e após isso é "vida que se segue". Em outras palavras: um erro ocorrido no nível 3 (que pode não ter tratamento), usará o tratamento de erro do nível 2, e o nível 1 nunca ficará sabendo das faltas que ocorreram. Tudo poderia ser resolvido tratando todo o erro no nível 3, certo? Errado! E se eu precisar além de tratar o erro no nível 3, relatar o erro ao nível 2 para que ele prossiga com sua rotina ciente que algo não correu como esperado?
O que quero dizer é que e eu posso precisar que cada função individual primeiro finalize suas pendências e relate o erro ao nível imediatamente superior para que um tratamento adequado seja dado àquela falha que ocorreu.
Bom... essa é a finalidade deste exemplo.
Quando um erro ocorre, o VBA perdoa fácil. Isto é, o VBA procura o primeiro tratamento de erro existente e faz o que tem que fazer, e após isso é "vida que se segue". Em outras palavras: um erro ocorrido no nível 3 (que pode não ter tratamento), usará o tratamento de erro do nível 2, e o nível 1 nunca ficará sabendo das faltas que ocorreram. Tudo poderia ser resolvido tratando todo o erro no nível 3, certo? Errado! E se eu precisar além de tratar o erro no nível 3, relatar o erro ao nível 2 para que ele prossiga com sua rotina ciente que algo não correu como esperado?
O que quero dizer é que e eu posso precisar que cada função individual primeiro finalize suas pendências e relate o erro ao nível imediatamente superior para que um tratamento adequado seja dado àquela falha que ocorreu.
Bom... essa é a finalidade deste exemplo.
- Código:
Public Sub fncCliqueiEmUmBotao()
On Error GoTo trataErro
'verifica campos obrigatórios
Call fncSalvaUmCadastro
sair:
On Error Resume Next
Exit Sub
trataErro:
'erros dentro desta função ou de funções de nível inferiores farão com esta parte da tratativa seja executada
Select Case Err.Number
Case Else
Call MsgBox("Erro nº: " & Err.Number & String(2, vbNewLine) & "Origem: " & Err.Source & String(2, vbNewLine) & "Descrição: " & Err.Description, vbCritical, "Erro")
End Select
End Sub
Private Sub fncSalvaUmCadastro()
On Error GoTo trataErro
Dim objErro(1 To 3) As String
'abre a conexão
'inicia um procedimento de salvamento
'um erro acontece, indo para o ponto trataErro
MsgBox 1 / 0
sair:
On Error Resume Next
'fecha a conexão quando tudo corre bem
Exit Sub
trataErro:
'salva informações do erro
objErro(1) = Err.Number
objErro(2) = Err.Source
objErro(3) = Err.Description
On Error Resume Next
'executa procedimentos necessários de fechamento de conexão
'fecha a conexão
'retira tratamento de erros
On Error GoTo 0
'causa o erro novamente, só que agora fechou o que tinha que fechar
'e erros causados serão repassados para a função que chamou
Call Err.Raise(objErro(1), objErro(2), objErro(3))
End Sub