Complemento;
Instrução On Error
Ativa uma rotina de tratamento de erro e especifica o local da rotina dentro de um procedimento; pode ser usada também para desativar uma rotina de tratamento de erro.
Sintaxe
On Error GoTo line
On Error Resume Next
On Error GoTo 0
A sintaxe da instrução On Error pode ter qualquer uma das seguintes formas:
On Error GoTo line
Ativa a rotina de tratamento de erro que inicia na linha especificada do argumento line obrigatório. O argumento line é qualquer rótulo de linha ou número de linha. Se ocorrer um erro em tempo de execução, o controle desvia para line, tornando o tratamento de erro ativo. A line especificada deve estar no mesmo procedimento em que se encontra a instrução On Error; caso contrário, ocorrerá um erro em tempo de compilação.
On Error Resume Next
Especifica que, quando ocorrer um erro em tempo de execução, o controle passará para a instrução imediatamente seguinte à instrução onde ocorreu o erro e a execução continua. Use este formulário em vez de On Error GoTo quando acessar objetos.
On Error GoTo 0
Desativa qualquer manipulador de erro ativo no procedimento atual.
Se você não usar uma instrução On Error, qualquer erro em tempo de execução que ocorrer será fatal, isto é, será exibida uma mensagem de erro e a execução pára.
Um manipulador de erro "ativado" é o que foi ativado por uma instrução On Error; um manipulador de erro "ativo" é um manipulador ativado que está no processo de tratar um erro. Se ocorrer um erro enquanto o manipulador de erro estiver ativo (entre a ocorrência do erro e uma instrução Resume, Exit Sub, Exit Function ou Exit Property), o manipulador de erro do procedimento atual não poderá tratar o erro. O controle retornará para o procedimento de chamada. Se o procedimento de chamada possuir um tratamento de erro ativado, ele será ativado para tratar o erro. Se o manipulador de erro do procedimento de chamada também estiver ativo, o controle passará de volta pelos procedimentos de chamada anteriores até encontrar um manipulador de erro ativado, mas inativo. Se não for encontrado nenhum manipulador de erro ativado e inativo, o erro será fatal no ponto em que ele realmente ocorreu. Sempre que o manipulador de erro passa o controle de volta para um procedimento de chamada, esse procedimento torna-se o procedimento atual. Uma vez que o erro é tratado por um manipulador de erro em qualquer procedimento, a execução continua no procedimento atual no ponto designado pela instrução Resume.
Observação Uma rotina de tratamento de erro não é um procedimento Sub ou Function. É uma seção do código marcada por um rótulo ou número de linha.
As rotinas de tratamento de erro dependem do valor na propriedade Number do objeto Err para determinar a causa do erro. A rotina de tratamento de erro deve testar ou salvar valores de propriedade relevantes do objeto Err antes que qualquer outro erro possa ocorrer ou antes que um procedimento que possa causar um erro seja chamado. Os valores de propriedade no objeto Err refletem somente o erro mais recente. A mensagem de erro associada a Err.Number está contida em Err.Description.
On Error Resume Next faz com que a execução continue com a instrução imediatamente após a instrução que causou o erro em tempo de execução ou continue com a instrução imediatamente após a chamada mais recente do procedimento que contém a instrução On Error Resume Next. Essa instrução permite que a execução continue apesar de um erro em tempo de execução. Você pode colocar a rotina de tratamento de erro onde é possível a ocorrência de erro, em vez de transferir o controle para outro local dentro do procedimento. Uma instrução On Error Resume Next torna-se inativa quando outro procedimento for chamado, assim você deve executar uma instrução On Error Resume Next em cada rotina chamada para tratar os erros em linha dentro dessa rotina.
Observação A construção On Error Resume Next pode ser preferível a On Error GoTo ao tratar erros gerados durante o acesso a outros objetos. Verificar Err após cada interação com um objeto remove a ambigüidade sobre qual objeto foi acessado pelo código. Você pode ter certeza de qual objeto colocou o código de erro em Err.Number, assim como qual objeto gerou originalmente o erro (o objeto especificado em Err.Source).
On Error GoTo 0 desativa o tratamento de erro no procedimento atual. Ele não especifica a linha 0 como início do código de tratamento de erro, mesmo que esse procedimento contenha uma linha com o número 0. Sem a instrução On Error GoTo 0, um tratamento de erro é automaticamente desativado ao sair do procedimento.
Para evitar que o código de tratamento de erro seja executado quando não ocorreram erros, coloque uma instrução Exit Sub, Exit Function ou Exit Property imediatamente antes da rotina de tratamento de erro, como no exemplo a seguir:
Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ErrorHandler
. . .
Exit Sub
ErrorHandler:
. . .
Resume Next
End Sub
Aqui, o código de tratamento de erro segue a instrução Exit Sub e precede a instrução End Sub para separá-lo do fluxo de procedimento. O código de tratamento de erro pode ser colocado em qualquer lugar do procedimento.
Os erros não interceptados em objetos são retornados ao aplicativo de controle quando o objeto está sendo executado como um arquivo executável. Dentro do ambiente de desenvolvimento, os erros não interceptados são retornados ao aplicativo de controle somente se as opções apropriadas estiverem definidas. Consulte a documentação de seu aplicativo host para obter uma descrição das opções que devem ser definidas durante a depuração, como defini-las e se o host pode criar classes.
Se você criar um objeto que acessa outros objetos, deve tentar tratar os erros que foram retornados deles sem que tenham sido tratados. Se você não puder tratar esses erros, mapeie o código do erro em Err.Number para um de seus próprios erros e, em seguida, retorne-os para o chamador de seu objeto. Você deve especificar seu erro adicionando o código de erro à constante vbObjectError. Por exemplo, se o código de erro for 1052, atribua-o como a seguir:
Err.Number = vbObjectError + 1052
Observação:
Os erros de sistema durante as chamadas às dynamic-link libraries (DLL, bibliotecas de vínculo dinâmico) ou aos recursos de código do Macintosh não levantam exceções e não podem ser interceptados com a interceptação de erro do Visual Basic. Ao chamar funções DLL, você deve verificar o êxito ou falha de cada valor retornado (de acordo com as especificações API (Application Programming Interface, interface de programação de aplicativo)) e, em caso de falha, verificar o valor da propriedade LastDLLError do objeto Err. LastDLLError sempre retorna zero no Macintosh.
Última edição por Norberto Rost em 4/4/2012, 04:13, editado 1 vez(es) (Motivo da edição : Exemplo deletado: apenas um exemplo por tópico nesta sala.)