Professional Documents
Culture Documents
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.
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
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.
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
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.
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.
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.