Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Dicas de Programação #10

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!

 

 

Inserir Imagens no SQL Server

Em dois artigos anteriores, foram abordadas algumas formas de trabalhar com dados num servidor SQL. Gestão de Dados em SQL Server - Parte I e Gestão de Dados em SQL Server - Parte II mostraram como inserir, modificar, apagar e ler dados, mas no entanto podem-se também inserir imagens e não basta simplesmente indicar qual é a imagem.

Existem duas alternativas para a gestão de imagens: guardar apenas a localização e colocar a imagem no servidor ou gravar a imagem directamente num campo.

Para inserir a imagem é necessário ler, gravar num array de bytes e finalmente utilizar esse array para gravar na base de dados.

Eis um exemplo de como o fazer:

        ' Define a Connection String
        Dim myConnectionString As String = _
            "Data Source=.\SQLEXPRESS;AttachDbFilename='c:\myDatabase.mdf';Integrated Security=True;User Instance=True"

        Try

            ' Cria um novo FileStream para leitura da imagem
            Dim fs As New IO.FileStream("c:\image.jpg", IO.FileMode.Open, IO.FileAccess.Read)

            ' Cria um array de Bytes do tamanho do FileStream 
            Dim ImageData(fs.Length() - 1) As Byte

            ' Lê os bytes do FileStream para o array criado
            fs.Read(ImageData, 0, ImageData.Length)

            ' Fecha o FileStream ficando a imagem guardada no array
            fs.Close()

            Using connection As New SqlClient.SqlConnection(myConnectionString)

               
' Define o comando Transact-SQL para inserir dados
                Dim SQL As String = "INSERT INTO contacts ([name],[img]) VALUES (@name,@img);"
                Dim command As New SqlClient.SqlCommand(SQL, connection)

                ' Define os parâmetros para a inserção de dados, onde está o array 
                ' de bytes(imagem) a ser inserida. O tipo do campo é Image
                command.Parameters.Add("@name", SqlDbType.VarChar).Value = "jpaulino"
                command.Parameters.Add("@img", SqlDbType.Image).Value = ImageData
                connection.Open()

                ' Insere os campos no SQL
                command.ExecuteNonQuery()

            End Using

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

4 comentários:

Bruno disse...

Eu gostaria de saber se no catch dava para apanhar um erro por exemplo: quando na quele evento desse o erro número 123456 daría uma mensagem por exemplo.


Desde já muito obrigado

jpaulino disse...

Olá Bruno,

A função que existia no VB6 (ou anterio) não desapareceu.

Podes usar sempre o Err.Number

Bruno disse...

Funciona na perfeição :)

Muito obrigado

Anónimo disse...

insiro as imagens muito bem, e depois como as passo para uma picture box?? é que o pic_box.image = campo da base dados nao da, diz q bite para image nao é permitido

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico