LINGUAGEM DE PROGRAMAÇÃO I OBJETIVOS DA AULA • • • • • • • • Exceções Tratamento de Exceções Estruturadas Tipos de Exceção Bloco Try... End Try A seção Catch Blocos Try... End Try Aninhados A seção Finally Lançamento de Exceções 2 Exceção • Exceção é um erro no fluxo normal de execução do código de um programa de uma aplicação. • O .NET framework oferece uma forma unificada de identificar e tratar exceções entre todas as linguagens de programação .NET (BALENA, 2006). • Há dois tipos de exceções: Exceções de Hardware Exceções de Software. 3 Exceção Exceção de Hardware São causadas por erros do programa a nível de hardware. Exemplo: Violação de acesso a endereços de memória. Exceção de Software são causadas por erros do programa a nível de software. Exemplo: Atribuir um valor incompatível a uma variável Divisão por zero (MACKENZIE e SHARKEY, 2003). 4 Tratamento de Exceções Estruturadas (SEH) • O tratamento de exceções estruturadas (Structured Exception Handling - SEH) é uma estratégia para codificar o programa de uma aplicação para tratar tanto as exceções de hardware quanto as exceções de software. • Dessa forma, o código para tratamento de exceções se torna unificado e mais consistente por tratar tanto as exceções de hardware quanto as exceções de software. • O tratamento de exceções estruturadas é codificado para proteger seções do código que estiverem propensas a gerarem exceções como, por exemplo, cálculos, acesso a banco de dados, operações com arquivos etc. (MACKENZIE e SHARKEY, 2003). 5 Tipos de Exceções • Os principais tipos de exceções são: – – – – – – – – ArgumentException ArgumentNullException ArgumentOutOfRangeException IndexOutOfRangeException NotImplementedException OutOfMemoryException OverflowException FileNotFoundException Os tipos de exceções derivam da classe System.Exception que é definida no .NET framework. 6 Bloco Try ... End Try • As palavras-chave Try... End Try delimitam o bloco de códigos protegidos para tratar as exceções que ocorrerem. Sintaxe: Try ... Catch ex As Exception ... End Try Cath: Marca a seção do bloco que captura e trata as exceções que podem eventualmente ocorrer. Em geral, usa-se uma seção Catch para capturar cada tipo de exceção e uma seção Catch, chamada genérica, no final para capturar todos os demais tipos de exceções que não foram capturados pelas seções Catch anteriores. 7 Bloco Try ... End Try Sintaxe: Try ... Catch ex1 As Exception1 ' Código para tratamento da Exception1 ... Catch exN As ExceptionN ' Código para tratamento da ExceptionN ... ' Captura Genérica Catch ex As Exception ' Código para tratamento das demais exceções ... End Try 8 Bloco Try ... End Try Exemplo: Sem Captura e Tratamento de Exceção Sub Main() Erro: Divisão por Zero Dim i As Decimal = 10 Dim j As Decimal = 0 Dim Resultado As Decimal Resultado = i / j Console.ReadKey() End Sub 9 Bloco Try ... End Try Exemplo: Com Captura e Tratamento de Exceção Sub Main() Dim i As Decimal = 10 Dim j As Decimal = 0 Dim Resultado As Decimal Permite realizar a captura e o tratamento da exceção genérica, ou seja, de qualquer tipo de exceção. Try Resultado = i / j Catch ex As Exception ' Captura Genérica Console.WriteLine("Houve um erro de exceção de divisão por zero.") End Try Console.ReadKey() End Sub 10 Bloco Try ... End Try Exemplo: Com Captura e Tratamento de Exceção Sub Main() Dim i As Decimal = 10 Permite realizar a captura e o tratamento da Dim j As Decimal = 0 Divisão por Zero e capturar e tratar uma exceção Dim Resultado As Decimal genérica, ou seja, de qualquer tipo de exceção. Try Resultado = i + 10 Resultado = i / j Catch exDivideByZero As DivideByZeroException ‘ Captura DivideByZeroException Console.WriteLine("Houve um erro de exceção de divisão por zero.") Catch ex As Exception ' Captura Genérica Console.WriteLine("Houve um erro de exceção genérica.") End Try Console.ReadKey() End Sub 11 Bloco Try ... End Try - Aninhado Imports System.IO Define um bloco Try...End Try externo que Module Module1 contém um outro bloco Try...End Try interno. Sub Main() Dim FileName As String = "TestFile.data" ' Bloco externo Try Dim fs As New FileStream(FileName, FileMode.Open, FileAccess.Read) ' Bloco interno Try Dim reader As New BinaryReader(fs) reader.ReadInt32() Catch ex As Exception Se ocorrer uma exceção na Console.WriteLine("Exceção na leitura do arquivo.") abertura do arquivo, o programa End Try exibe a mensagem "Exceção na Catch ex As Exception abertura do arquivo." e se após a Console.WriteLine("Exceção na abertura do arquivo.") abertura do arquivo sem exceção, End Try ocorrer uma exceção na leitura do Console.ReadKey() arquivo, o programa exibe a End Sub mensagem "Exceção na leitura do End Module arquivo.“ 12 Seção Finally • Define o código que deverá ser sempre executado, sem ou com a ocorrência de uma exceção, antes de terminar o bloco Try...End Try. • Em geral, contém o código para liberar recursos alocados no bloco Try...End Try ou o código comum a ser executado antes de terminar o bloco Try...End Try. 13 Seção Finally Sub Main() Dim i As Decimal = 10 Dim j As Decimal = 0 Dim Resultado As Decimal Sempre emite um sinal sonoro, Beep(), antes de terminar o bloco Try...End Try. Try i = i + 10 Resultado = i / j Catch exDivideByZero As DivideByZeroException ' Captura DivideByZeroException Console.WriteLine("Houve um erro de exceção de divisão por zero.") Catch ex As Exception ' Captura Genérica Console.WriteLine("Houve um erro de exceção genérica.") Finally Beep() End Try Console.ReadKey() End Sub 14 Lançamento de Exceções • Em algumas situações você pode deseja lançar uma exceção para esta seja tratada por uma rotina de tratamento de exceção ou para gerar uma exceção. Sintaxe: Throw [ expressão ] 15 Lançamento de Exceção Sub Main() Exemplo: Lançamento de Exceção Dim i As Decimal = 10 Dim j As Decimal = 0 Dim Resultado As Decimal Lançar uma exceção genérica com a mensagem "Divisor j igual a zero" se o valor da variável j for igual a zero. Try i = i + 10 If (j = 0) Then Throw New System.Exception("Divisor j igual a zero.") End If Resultado = i / j Catch ex As Exception ' Captura Genérica Console.WriteLine("Houve um erro de exceção de divisão por zero.") Finally Beep() End Try Console.ReadKey() End Sub 16 Saiba Mais .... – – – – – – – – – – Tratamento de Exceções • http://msdn.microsoft.com/pt-br/library/c68xfk56.aspx Manipulação Estruturada de Exceções • http://msdn.microsoft.com/pt-br/library/8a9f2ew0.aspx Classe Exception • http://msdn.microsoft.com/pt-br/library/system.exception.aspx Como Capturar uma exceção • http://msdn.microsoft.com/pt-br/library/ys1b32h3.aspx Declaração Try... Catch... Finally... End Try • http://msdn.microsoft.com/pt-br/library/fk6t46tz.aspx Tratamento de Exceção Não Estruturado • http://msdn.microsoft.com/pt-br/library/sf1hwa21.aspx Declaração On Error • http://msdn.microsoft.com/pt-br/library/5hsw66as.aspx Quando Usar Manipulação de Exceção Estruturada ou Não Estruturada • http://msdn.microsoft.com/pt-br/library/s74yzzb5.aspx Como Lançar um exceção • http://msdn.microsoft.com/pt-br/library/z7w9ff54.aspx Declaração Throw em linguagem • http://msdn.microsoft.com/pt-br/library/ty79csek.aspx 17 Próxima Aula – Programação Orientada a Objetos 18