You are on page 1of 5

Tratando Erros em VBA

 Ao programar um aplicativo, precisamos imaginar o que acontece quando ocorrer um erro. Um erro pode
ocorrer por uma de duas razões. Primeira: alguma condição no momento que o aplicativo está sendo executado
faz com que algum código válido falhe. Por exemplo, se o aplicativo tentar usar uma tabela que foi excluída pelo
usuário, vai ocorrer um erro. Segunda: o código pode conter lógica incorreta que evita que o aplicativo execute
o que deveria. Por exemplo, um erro acontece se tentarmos dividir um valor qualquer por zero.  

Erros e Tratamento de Erros


Ao programar um aplicativo, precisamos imaginar o que acontece quando ocorrer um erro. Um erro pode
ocorrer por uma de duas razões. Primeira: alguma condição no momento que o aplicativo está sendo
executado faz com que algum código válido falhe. Por exemplo, se o aplicativo tentar usar uma tabela que
foi excluída pelo usuário, vai ocorrer um erro. Segunda: o código pode conter lógica incorreta que evita
que o aplicativo execute o que deveria. Por exemplo, um erro acontece se tentarmos dividir um valor
qualquer por zero.

Se não implementarmos o tratamento de erros, o Visual Basic para a execução e apresenta uma
mensagem de erro padrão quando acontecer algum problema no aplicativo. O usuário vai ficar confuso e
frustrado se isto acontecer. Podemos evitar muitos problemas incluindo rotinas de tratamento de erros
nos códigos, visando atender de forma correta os erros que possam ocorre.

Ao criar o tratamento de erro em um procedimento devemos considerar o que a rotina vai fazer quando
ocorrer um erro. O primeiro passo para encaminhar a execução para o tratamento de erro é ativar o
tratamento de erros usando alguma forma de declaração On Error dentro do procedimento. A declaração
On Error encaminha a execução na ocorrência de um erro. Se não existir uma declaração On Error, o
Visual Basic simplesmente para a execução e exibe uma mensagem de erro padrão.

Quando ocorre um erro em um procedimento com rotina de tratamento habilitada, o Visual Basic não
apresenta a mensagem padrão. Em vez disso, ele encaminha a execução para o tratamento de erros, se
existir. Quando a execução passa para um tratamento de erro habilitado, o tratamento de erros fica ativo.
Dentro do tratamento de erros podemos determinar o tipo de erro que ocorreu e resolvê-lo como
desejarmos. O Microsoft Access fornecem três objetos que contém informações sobre erros que possam
ocorrer: o objeto ADO Error, o objeto Err do Visual Basic e o objeto DAO Error.

Desviando a Execução Quando Ocorre um Erro


O tratamento de erros especifica o que acontece em um procedimento quando ocorre um erro. Por
exemplo, podemos desejar que a rotina tenha sua execução cancelada se ocorrer um tipo de erro ou
podemos desejar que a condição que causou o erro seja corrigida e o procedimento continue a ser
executado. As declarações On Error e Resume determinam o que o procedimento vai fazer no caso de
ocorrência de erro.

A Declaração On Error
A declaração On Error ativa ou desativa a rotina de tratamento de erros. Se uma rotina de tratamento de
erros estiver ativada, a execução passa para a rotina quando ocorrer um erro.

A declaração On Error pode ter três formatos: OnError GoTo rótulo, On Error GoTo 0, e On Error Resume
Next. 

A declaração On Error GoTo rótulo ativa uma rotina de tratamento de erros, iniciando na linha onde a
declaração é encontrada. A rotina de tratamento de erros deve ser ativada antes da primeira linha onde
um erro possa ocorrer. Quando a rotina de tratamento de erros está ativada e ocorre um erro, a execução
é transferida para a linha especificada no argumento rótulo.

A linha especificada pelo argumento rótulo deve ser o início da rotina de tratamento de erros. Por
exemplo, o procedimento a seguir especifica que, se ocorrer um erro, a execução deve ser transferida
para a linha com o rótulo Erro_PodeCausarUmErro:

Function PodeCausarUmErro ()
' Ativa o tratamento de erros.
On Error GoTo Erro_PodeCausarUmErro
‘… Inclua aqui o código que pode causar um erro
‘.
‘.
Erro_PodeCausarUmErro
‘. Inclua aqui o código para tartar erros
‘.
‘.
End Function

A declaração On Error GoTo 0 desativa o tratamento de erros dentro de um procedimento. Ela não
especifica a linha 0 como início do tratamento de erros, mesmo que o procedimento contenha uma linha
numerada 0. Se não existir uma declaração On Error GoTo 0 no código, o tratamento de erros é
desabilitado automáticamente quando a rotina é executada completamente. A declaração On Error GoTo
0 limpa as propriedades de objeto Err, tendo o mesmo efeito do método Clear do objeto Err.

A declaração On Error resume Next ignora alinha que causou o erro e encaminha a execução para a linha
seguinte àquela que causou o erro. A execução não é interrompida. A declaração On Error Resume Next
deve ser usada para verificar as propriedades do objeto Err imediatamente após a execução de uma linha
onde um erro possa ocorrer e tratar o erro dentro do procedimento em vez de uma rotina de tratamento
de erros.

A Declaração Resume
A declaração Resume retorna a execução ao corpo do procedimento de dentro da rotina de tratamento de
erros, A declaração Resume pode ser incluída em uma rotina de tratamento de erro para continuar a
execução a partir de um ponto particular do procedimento. A declaração Resume não é necessária, já que
a execução do procedimento pode ser encerrada após a rotina de tratamento de erros.
A declaração Resume também tem três formatos. A declaração Resume ou Resume 0 retornam a
execução para a linha onde ocorreu o erro.
A declaração Resume Next retorna a execução para a linha seguinte àquela onde ocorreu o erro.
A declaração Resume rótulo retorna a execução para a linha especificada pelo argumento rótulo. O
argumento rótulo deve indicar uma linha de rótulo ou um núimero de linha.
Normalmente usamos a declaração Resume ou Resume 0 quando o usuário deve fazer uma correção.
Por exemplo, solicitar ao usuário o nome de uma tabela a ser aberta e o usuário entrar com um nome de
tabela que não existe. Podemos solicitar uma nova entrada e voltar à linha onde ocorreu o erro, para
testar novamente.

A declaração Resume Next é usada quando o código da rotina de tratamento de erros corrige o erro e a
execução pode continuar sem voltar à linha que causou o erro.

A declaração Resume rótulo é usada para continuar a execução em outro ponto do procedimento,
especificado pelo argumento rótulo. Um exemplo é continuar a execução em uma rotina de sida, como
descrito na seção a seguir.

Saindo de um Procedimento
Quando incluímos uma rotina de tratamento de erros em um procedimento devemos incluir, também uma
rotina de saída, de modo que a rotina de tratamento de erros seja executada apenas na ocorrência de um
erro. Podemos especificar uma rotina de saída do mesmo modo que especificamos uma rotina de
tratamento de erros.

Por exemplo, podemos adicionar uma rotina de saída ao exemplo da seção anterior. Se não ocorrer um
erro, a rotina de saída é executada após o corpo do procedimento. Se ocorrer um erro, a execução é
transferida para a rotina de saída após a execução do código na rotina de tratamento de erros. A rotina de
saída contém uma declaração Exit.

Function PodeCausarUmErro()
' Ativa o tratamento de rros.
On Error GoTo Erro_PodeCausarUmErro
‘. Inclua código que pode causar um erro.
‘.
‘.

Saida_PodeCausarUmErro:
Exit Function

Erro_PodeCausarUmErro:
‘. Inclua o código para tratamento de erros.
‘.
‘.
' Continue a execução com a rotina de saída.
Resume Saida_PodeCausarUmErro
End Function

Tratando Erros em Procedimentos Aninhados


Quando ocorre um erro em procedimentos aninhados (um procedimento que chama outro) que não tenha
tratamento de erros ativado, o Visual Basic procura por uma rotina de tratamento de erros nos
procedimentos que chamaram o procedimento com erro em vez de simplesmente parar a execução. Isto
dá ao código uma oportunidade de corrigir o erro em um procedimento diferente. Por exemplo, o
Procedimento A chama o Procedimento B e o Procedimento B chama o Procedimento C. Se ocorrer um
erro no Procedimento C e não houver rotina de tratamento de erros habilitada, o Visual Basic verifica o
Procedimento B e o Procedimento A em busca de uma rotina de tratamento de erros ativada. Se existir, a
execução é transferida para a rotina. Se não, a execução é interrompida e uma mensagem de erro é
apresentada.

O Visual Basic também procura nas rotinas chamadoras por uma rotina de tratamento de erros ativa se o
erro corer dentro de uma rotina de tratamento de erro ativa. Podemos forçar o Visual Basic a procurar
pela lista de chamadas levantando um erro dentro da rotina de tratamento de erro atual com o uso do
método Raise do objeto Err. Isto é útil pois permite o tratamento de erros não antecipados dentro da rotina
de tratamento de erros. Se ocorrer um erro inesperado e o erro for recriado dentro do tratamento de erros,
a execução será passada para o procedimento chamador, procurando uma rotina de tratamento que
atenda o erro gerado.

Por exemplo, suponhamos que o Procedimento C tenha uma rotina de tratamento de erros que não seja a
correta para o erro que aconteceu. Uma vez que o tratador de erros tenha verificado todos os erros para
os quais tenha havido antecipação, ele pode regerar o erro original. A execução, então, passa para o
tratamento de erros do Procedimento B, se existir, dando a oportunidade desta rotina tratar o erro. Se não
existir uma rotina de tratamento de erros no Procedimento B ou ela não conseguir corrigir o erro, a
execução passa para a rotina de tratamento de erros do Procedimento A, se existir.
Para demonstrar este conceito de outra forma, suponhamos que temos um procedimento aninhado que
inclui o tratamento de erro de tipo de dados, um erro que foi antecipado. Em certo ponto, um erro de
divisão por zero, que não foi antecipado, ocorre dentro do Procedimento C. Se incluirmos a declaração de
regerar o erro original, a execução passa para o tratamento de erros do procedimento chamador, se
houver. Se a divisão por zero foi corrigida em outro procedimento da lista de chamadas, o erro será
corrigido. Se o código não regerar o erro, o procedimento continua sem a correção da divisão por zero.
Isto, por sua vez, pode causar outros erros dentro do conjunto de procedimentos aninhados.

Em resumo, o Visual Basic procura por uma rotina de tratamento de erros pela lista de chamadas se:

Ocorrer um erro em um procedimento que não tem uma rotina de tratamento de erros habilitada.

Ocorrer um erro dentro da rotina de tratamento de erros ativa. Se usarmos o método Raise do objeto Err
para levantar um erro, podemos forçar o Visual Basic a buscar pela lista de chamadas por uma rotina de
erros habilitada.

Obtendo Informações Sobre Erros


Depois que a execução passou pela rotina de tratamento de erros, o código deve determinar qual erro
ocorreu e como tratá-lo. O Visual Basic e o Microsoft Access fornecem diversos elementos de linguagem
que podem ser utilizados para obter informações sobre erros específicos. Cada um trata diferentes tipos
de erros. Como os erros podem ocorrer em diferentes partes do aplicativo, pr5ecisamos determinar que
elemento usar no código, com base nos erros esperados.

Os elementos disponíveis para tratamento de erros incluem:


O objeto Err.
O Objeto Error do DAO e a coleção Errors.
O Objeto Error do ADO e a coleção Errors.
O método AccessError.
O evento Error.

O Objeto Err
O objeto Err é fornecido pelo Visual Basic. Quando ocorre um erro do Visual Basic, as informações sobre
o erro são armazenadas no objeto Err. O objeto Err mantém informações sobre apenas um erro de cada
vez. Quando um novo erro ocorre, o objeto Err é atualizado para incluir as informações sobre ele.

Para obter informações sobre um erro em particular, podemos usar as propriedades e métodos do objeto
Err. A propriedade Number é a propriedade padrão do objeto Err, devolvendo o número identificador do
erro ocorrido. A propriedade Description do objeto Err devolve a string descritiva associada com o erro do
Visual Basic. O método Clear limpa a informação do erro atual do objeto Err. O método Raise gera um
erro específico e preenche as propriedades do objeto Err com as informações sobre aquele erro.

O exemplo a seguir mostra como usar o objeto Err em um procedimento que pode causar um erro de tipo
de dados:

Function PodeCausarUmErro()
‘ Declara uma constante para representar um possível erro.
Const conTypeMismatch As Integer = 13

On Error GoTo Erro_PodeCausarUmErro


. ' Incluir o código que pode causar o erro.
.
.

Saida_PodeCausarUmErro:
Exit Function

Erro_PodeCausarUmErro:
' Verifica as propriedades do objeto Err.
If Err = conTypeMismatch Then
. ' Incluir o código para tratar o erro.
.
.
Else
' Regerar o erro original.
Dim intErrNum As Integer
intErrNum = Err
Err.Clear
Err.Raise intErrNum
End If
' Continua a execução com a rotina de saída da função.
Resume Saida_PodeCausarUmErro
End Function

Neste exemplo o método Raise é musado para regerar o erro original. Se um erro diferente de tipo de
dados ocorrer, a execução será passada para a lista de chamadas até outra rotina de tratamento de
erros, se existir.

O objeto Err fornece todas as informações necessárias sobre os erros do Visual Basic mas não dá
informações completas sobre erros do Microsoft Access ou erros de motor de banco de dados do
Microsoft Access. O Microsoft Access e o Data Access Objects (DAO) fornecem elementos adicionais de
linguagem para auxiliar no tratamento destes erros.

O Objeto Error e a Coleção Errors


O objeto Error e a coleção Errors são fornecidos pelo DAO e pelo ADO. O objeto Error representa um erro
do DAO ou do ADO. Uma única operação ADO ou DAO pode causar diversos erros, especialmente ao
executar operações DAO ODBC. Cada erro que ocorre durante uma operação de acesso a dados tem um
objeto Error associado. Todos os objetos Error associados a uma operação DAO ou ADO particular são
armazenados na coleção Errors, sendo o erro de nível mais baixo o primeiro objeto da coleção e o erro de
nível mais alto o último objeto da coleção.

Quando ocorre um erro DAO ou ADO, o objeto Err do Visual Basic contém o número de erro do primeiro
objeto da coleção Errors. Para determinar se ocorreram outros erros DAO ou ADO, temos que verificar a
coleção Errors. Os valores das propriedades Number e Description do DAO ou ADO do primeiro objeto
Error na coleção Errors deve corresponder aos valores das propriedades Number e Description do objeto
Err do Visual Basic.

O Método AccessError
Podemos usar o método Raise do objeto Err para gerar um erro do Visual Basic que não ocorreu de
verdade e determinar a string descritiva associada com tal erro. Não podemos usar o método Raise para
gerar um erro do Microsoft Access, do DAO ou do ADO. Para determinar a string associada a um erro do
Microsoft Access, do DAO ou do ADO que não ocorreu na realidade, temos que usar o método
AccessError.

O Evento Ao Ocorrer Erro

Podemos usar o evento Ao ocorrer erro para detectar erros que ocorram em um formulário ou relatório do
Microsoft Access. Por exemplo, se um usuário tentar entrar com texto em um campo Data/Hora, ocorre o
evento Ao ocorrer erro. Se adicionarmos um procedimento de evento a um formulário e tentarmos entrar
com texto em um campo Data/Hora, por exemplo, o procedimento Error do formulário mou relatório será
executado.

O evento Ao ocorrer erro exige um argumento inteiro, DataErr. Quando um evento Ao ocorrer erro é
disparado e o procedimento é executado, o argumento DataErr contém o número do erro do Microsoft
Access que ocorreu. A verificação do conteúdo do argumento DataErr dentro do procedimento de evento
é a única forma de determinar o número do erro que ocorreu. O objeto Err não é preenchido com as
informações do erro depois que o evento Error ocorre. Podemos usar o argumento DataErr em conjunto
com o método AccessError para determinar o número do erro e a descrição associada.

A declaração Error e a função Error são fornecidas apenas por questão de compatibilidade. Ao escrever
novo código devemos usar os objetos Err e Error, a função AccessError e o evento Ao ocorrer erro para
obter informações sobre erros.

You might also like