MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


    Mensagem para Tratamento de Erros

    avatar
    Convidad
    Convidado

    Mensagem para Tratamento de Erros Empty Mensagem para Tratamento de Erros

    Mensagem  Convidad em 3/4/2012, 19:09


    Mensagem para Tratamento de Erros

    Devemos incluir o tratamento de erros em todos os procedimentos.
    Se ocorrer um erro de procedimento, e nele não houver uma instrução On Error logo após a declaração, o aplicativo vai travar.
    Com essa instrução definimos o tipo de tratamento.
    Neste exemplo uso a instrução On Error GoTo Trato
    No tipo GoTo indicamos a linha do procedimento que o vba deve executar na ocorrência de erro.
    Indicamos a linha atribuindo-lhe um nome, e na linha inserimos o nome seguido de dois pontos.
    Colocamos um End Sub na linha anterior para que o tratamento seja executado apenas quando ocorrer erro.
    A direita do nome do tratamento, inserimos o código que será executado para tratamento.
    Neste exemplo o código chama uma função (ExplicaErro) que exibe uma MsgBox com várias informações.

    Os procedimentos seriam assim:


    Private Sub Controle_Evento()
    On Error GoTo Trato
    '...
    '...
    '...
    Exit Sub
    Trato: ExplicaErro
    End Sub


    A função abaixo deve ser colocada num módulo global:


    Option Compare Database
    Option Explicit

    'Constantes globais que retornam string's para variáveis

    Global Const constTitulo = "Não é nada grave!"
    Global Const constAviso = "Desculpe a interrupção, mas houve um probleminha:" & vbCrLf _
    & vbCrLf _
    & "Por favor, passe estas informações ao programador:" & vbCrLf _
    & vbCrLf
    Global Const constTipoObjeto = "O nome do objeto é: "
    Global Const constErroNumero = "O número de aviso é: "
    Global Const constErroNome = "A mensagem de aviso é: "
    Global Const constOkay = "Clique em OK ou tecle Enter para continuar." & vbCrLf _
    & vbCrLf _
    & "Bom trabalho!"


    Public Function ExplicaErro() As String

    Dim NomeObjeto, TipoObjeto, NumeroErro, NomeErro As String
    NumeroErro = Err.Number
    NomeErro = Err.Description
    NomeObjeto = Application.CurrentObjectName
    If Application.CurrentObjectType = acForm Then
    TipoObjeto = "Formulário "
    ElseIf Application.CurrentObjectType = acReport Then
    TipoObjeto = "Relatório "
    Else
    TipoObjeto = "Padrão "
    End If

    ExplicaErro = MsgBox(constAviso & vbCrLf _
    & constTipoObjeto & TipoObjeto & NomeObjeto & vbCrLf _
    & constErroNumero & NumeroErro & vbCrLf _
    & constErroNome & NomeErro & vbCrLf _
    & vbCrLf _
    & constOkay & " " & Now, vbOKOnly, constTitulo)

    End Function


    Exemplo da exibição da mensagem:

    Mensagem para Tratamento de Erros MensagemTratamentoErros

    Pode melhorar e personalizar.
    Não deixe de usar tratamento de erros.
    avatar
    Convidad
    Convidado

    Mensagem para Tratamento de Erros Empty Re: Mensagem para Tratamento de Erros

    Mensagem  Convidad em 3/4/2012, 19:31

    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) (Razão : Exemplo deletado: apenas um exemplo por tópico nesta sala.)

      Data/hora atual: 16/10/2019, 21:01