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 #7

Unhandled Exceptions

Uma boa parte do código é dedicada (ou deveria ser) para tratamento de erros, previstos ou imprevistos, de modo a mostrar ao utilizador final uma mensagem adequada a todo o tipo de situações. O normal é mostrar uma mensagem de erro mas há também quem a registe para análise, envie via e-mail, etc, etc.

No entanto existem sempre zonas do código “esquecidas” e erros que não estão previstos, por muito cuidado que se tenha e por muitas situações que se contemple.

É sempre incómodo e pouco profissional mostrar ao utilizador uma mensagem não personalizada quando ocorre um erro ou que, a aplicação encerre inexplicavelmente.

Para simplificar a vida ao programador, o Visual Studio.NET dispõe de eventos a nível da aplicação (e não específicos para um único form ou objecto) que incluem os eventos Startup, Shutdown, StartupNextInstance, NetworkAvailabilityChanged e UnhandledException (excepções não controladas). Desta forma consegue-se controlar facilmente alguns eventos gerais.

Neste exemplo será ainda mostrado como aceder a estes eventos (Visual Basic Application Model), apenas o UnhandledException, e registar no Event Log do Windows a mensagem gerada. Para implementar este exemplo seguir os seguintes passos:

1 – Menu Poject – Properties – e na Application Tab clicar no botão View Application Events;
2 – Na dropdownlist das classes seleccionar MyApplication Events
3 – Na dropdownlist dos métodos seleccionar UnhandledException

Isto irá originar um novo Sub chamado "MyApplication_UnhandledException" e também alguns comentários com informação sobre os métodos disponíveis. Finalmente utilizar o seguinte código:

Namespace My

    Partial Friend Class MyApplication

Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs)
Handles Me.UnhandledException

            ' Verifica o nome da aplicação
            Dim AppName As String = My.Application.Info.Title

            ' Define o nome do grupo a criar no event log
            Dim LogName As String = AppName & "LOG"

            ' Cria um nova instância do EventLog
            Dim log As New EventLog()

            ' Caso o grupo não exista, cria um novo
            If Not EventLog.SourceExists(AppName) Then
                EventLog.CreateEventSource(AppName, LogName)
            End If

            ' Define o nome da fonte do log
            log.Source = AppName

            ' Define a mensagem e escreve no ficheiro
            Dim msg As String = "Ocorreu uma erro no programa." & vbCrLf & _
                                             vbCrLf & e.Exception.Message
            log.WriteEntry(msg, System.Diagnostics.EventLogEntryType.Error)
            log.Dispose()

            ' Mosta a mensagem ao utilizador
            MessageBox.Show(msg)

            ' Define que a aplicação não termina
            e.ExitApplication = False

        End Sub   

    End Class

End Namespace

Finalmente para testar é só executar algo do género, associado a um botão ou outro evento:  

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim a As Byte = 50
        Dim b As Byte = 50
        Dim c As Byte = a * b

    End Sub

Como o Byte suporta valores numéricos de 0 a 255, e o resultado desta operação é 2500, irá originar um excepção ou erro.   

NOTA: Como o Visual Studio mostra o erro, seleccionando a linha, não é possível testar este código em modo de debug (teste) mas apenas em runtime (execução).

   

   

Passar informação entre Forms

Uma dúvida frequente é a forma como passar informação entre forms. Existem diversas formas de o fazer, umas mais correctas do que outras, devido a inúmeros factores. No entanto algumas são mais “recomendadas” porque não utilizam variáveis globais/públicas em módulos ou classes. Ficam dois exemplos de como se pode fazer:

#Método 1 – Enviar / Receber

Primeiro Form (master) que irá passar uma variável e receber outra através de uma nova propriedade criada:

    Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click

        ' Criação de uma nova instância
        Dim frm As New frmChild

        ' Atribuição de um valor à propriedade
        frm.myString = "vbtuga - teste"

        ' Mostra o frm como dialog, ou seja o resto do código
        ' só irá executar-se quando este for fechado
        frm.ShowDialog()   

        ' Mostra a nova mensagem
        MessageBox.Show(frm.myString)

    End Sub

Segundo Form (child) onde é criada uma propriedade e retornado um novo valor

     ' Variável auxiliar da propriedade
    Private _myString As String

    ' Criação de uma propriedade que pode passar informação
    ' em ambos os sentidos (master->child, child->master)
    Public Property myString() As String
        Set(ByVal value As String)
            _myString = value
        End Set
        Get
            Return _myString
        End Get
    End Property

    Private Sub frmChild_Load(ByVal sender As System.Object, _
                    ByVal e As System.EventArgs) Handles MyBase.Load

        ' Exibição da mensagem
        MessageBox.Show(Me.myString)

        ' Definição de novo texto da propriedade
        Me.myString = "Nova string"

    End Sub

   

#Método 2 – Enviar

Primeiro Form (master) que irá passar uma variável:

    Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click

        ' Criação de uma nova instância e define o texto como parâmetro
        Dim frm As New frmChild("vbtuga - teste")
        frm.Show()

    End Sub

Segundo Form (child) onde é alterado o construtor e exibida a mensagem

    Private myString As String

    ' Definição de um parâmetro no construtor do frm
    Sub New(ByVal str As String)
        InitializeComponent()   

        ' Actribuição do valor passado à variável privada
        myString = str

    End Sub

    Private Sub frmChild_Load(ByVal sender As System.Object, _
                    ByVal e As System.EventArgs) Handles MyBase.Load

        ' Exibição da mensagem
        MessageBox.Show(myString)

    End Sub


Dois exemplos simples mas muito úteis, porque este intercambio de informação entre forms é muito usual.



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

6 comentários:

Jônatas Sellos Pereira de Pinho disse...

Sobre sua dica "Passar informação entre Forms" no Método 1. Não seria mais fácil criar uma váriavel pública no frmchild e atribuir um valor para ela no frmmaster?? Eu sou novato em .Net e estou com essa dúvida: Qual a diferenca em fazer como vc ensinou no metodo 1 e como eu falei... Obrigado. E.mail / Msn: admsellos@gmail.com

Lucas Elias disse...

kra, pra falar a verdade
eu tentei dessa forma de criar a variavel publica.
e funcionou perfeitamente!!
já no caso do autor do blog eu nao entendi muito bem...
não sei se é pq eu tbm sou novato, mas deu certo de outro jeito. ;)

jpaulino disse...

Olá Lucas,

Claro que as variáveis globais funcionam, mas ocupam memória desnecessária e são mais dificeis de gerir. Sempre que possível devem-se evitar, a não ser que sejam mesmo necessárias para vários locais da aplicação.

ribeiro disse...

Já para não relembrar que uma form é uma classe e existem regras e padrões que se devem seguir.
Imaginem que têm 100 variáveis globais para controlar 10 tipos de objectos. Não é mais fácil cada objecto ter em si as 10 propriedades correspondentes?
Que grande baralhada seriam 100 variáveis globais...

Anónimo disse...

Boa tarde

Tenho um mini programa em VB

Acontece que está fechado, isto é, não consigo ver o código. É possivel faze-lo?

Obrigado

ruilouraco@gmail.com

jpaulino disse...

Olá,

Depende, se for VB6 é muito mais dificil (para não dizer impossível), mas se for VB.NET e não tiver obfuscado, podes utilizar um decompilador. Existem vários disponíveis.

Cumprimentos,
Jorge Paulino

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