Ferramentas de Utilizador

Ferramentas de Site


dev_net:vb.net:tratamento_erros

Tratamento de Erros

Teoricamente é possível criar uma aplicação em que todos os erros são tratados de modo a não acontecerem, ou seja, nunca existirem. Esta teoria na realidade não acontece por vários motivos, sendo como principal o facto do programador não contemplar ou não conseguir contemplar todos os possíveis problemas durante o desenvolvimento.

Uma correcta gestão dos erros na aplicação evita mensagens difíceis de analisar, aplicações a fecharem inesperadamente e torna, obviamente, as aplicações mais profissionais e robustas.

Com a introdução do .NET apareceu um novo método em substituição ao On Error Go To <label>. O método Try … Catch … End Try permite criar um bloco no código onde o erro é verificado e tratado. É simples de implementar, muito eficiente e com diversas variações que dão uma maior flexibilidade. Num exemplo simples funciona desta forma:

        Try
 
            ' código do programa 
 
        Catch ex As Exception
            MessageBox.Show(ex.Message) 
        End Try

No entanto existem mais variações que permitem uma melhor gestão dos erros. São o caso de instruções com o Finally, que permite que o código execute sempre, ou seja, caso exista ou não erro, e o When, que permite decidir se o erro é ou não “agarrado”.

Além disso pode-se a qualquer momento dizer que ocorreu um erro e forçar a mensagem sem duplicar código, através da instrução Throw.

Eis um pequeno exemplo, com a alteração de um valor ou outro, permite alterar a forma como a mensagem/erro é tratado, e mostra alguns métodos que é possível implementar:

    Sub CalculaResultado(ByVal valor1 As Integer, ByVal valor2 As Integer, ByVal ignoraErro As Boolean)
 
        Try
 
            ' Verifica se os valores são zero
            If valor1 = 0 AndAlso valor2 = 0 Then
 
                ' Define uma nova ArgumentNullException
                Dim msgErro As String = "Os valores a calcular não podem ser os dois 0"
                Throw New ArgumentNullException(msgErro, New Exception(String.Empty))
 
            End If
 
 
            ' Caso o valor 1 seja zero, vai ser originada uma 
            ' ArithmeticException devido à divisão por zero
            Dim valorfinal As Integer = valor2 / valor1
 
            ' Neste exemplo caso o resultado seja menor que 10 
            ' origina uma Exception simples
            If valorfinal < 10 Then
                Throw New Exception("O valor final não é valido")
            End If
 
 
        Catch ex As ArithmeticException When ignoraErro = False
            Debug.WriteLine("Não é permitida uma divisão de um valor por zero")
 
        Catch ex As ArgumentNullException When ignoraErro = False
            Debug.WriteLine(ex.Message)
 
        Catch ex As Exception
            Debug.WriteLine(ex.Message)
 
        Finally
            Debug.WriteLine("Fim do exemplo!")
        End Try
 
    End Sub

E alguns resultados:

           ' Calcula o resultado com números a zero
            CalculaResultado(0, 0, False)
 
            Os valores a calcular não podem ser os dois 0
            Fim do exemplo!
 
 
            ' Provoca uma divisão por zero
            CalculaResultado(0, 50, False)
 
            Não é permitida uma divisão de um valor por zero
            Fim do exemplo!
 
 
            ' Provoca uma divisão por zero, mas não trata o erro
            CalculaResultado(0, 50, True)
 
            Arithmetic operation resulted in an overflow.
            Fim do exemplo!
 
 
            ' Calcula onde o resultado é inferior a 10
            CalculaResultado(45, 50, False)
 
            O valor final não é valido
            Fim do exemplo!

Autoria

Este artigo foi inicialmente escrito por Jorge Paulino para o seu blog VBTuga - Visual Basic em Português.

dev_net/vb.net/tratamento_erros.txt · Esta página foi modificada pela última vez em: 2018/05/14 21:37 (Edição externa)