Tecnologia para Web Tratamento de Exceções Enrique Pimentel Leite de Oliveira [email protected] Tratamento de Exceções • Definição: Uma exceção é um evento que ocorre durante a execução de um programa que interrompe o fluxo normal de suas instruções. • A plataforma .Net oferece um mecanismo robusto para tratamento de exceções. – provêm da biblioteca System.Exception • Os erros são tratados como objetos que encapsulam informações necessárias para resolvê-los. Esse mecanismo é conhecido como SEH (Structured Exception Handling). Tratamento de Exceções • “Onde pode ocorrer uma exceção?” • Em geral a ocorrência de exceção abrange: – implementação incorreta da solução de um problema; – solicitação de uma tarefa que não está disponível; – utilização inconsistente de um objeto e de seus métodos. • Algumas situações que podem gerar exceções: – erros de entrada de dados do usuário; – erros de dispositivos; – limitações físicas de hardware como: discos cheios, memórias, etc; – erro de programação. Tratamento de Exceções • A forma tradicional para tratamento das situações errôneas, seria retornar um código de erro onde fosse possível analisar o que é dado válido ou inválido. Porém, esta forma de programação não condiz com orientação a objetos. • Em orientação a objetos, devemos utilizar exceções para tratar de situações onde erros podem ocorrer. O objeto Exception • O objeto Exception é a classe base para todas as exceções e define as propriedades que todas as exceções têm. O objeto Exception Propriedade Descrição Data Uma coleção de pares (chave/valor) que fornece detalhes adicionais sobre a exceção. HelpLink O link para o arquivo de ajuda que contém uma descrição da exceção. InnerException A exceção base que causou o problema. Message Texto descritivo da exceção. Source O nome da aplicação ou objeto que causou o problema. StackTrace Apresenta a seqüência de métodos chamados que dispararam o erro. TargetSite O método que lançou a exceção atual. Como tratar exceções • Estrutura básica try catch finally: try { // Código a ser executado } catch (TipoExceção1 e) { // tratamento da exceção1 } catch (Exception e) // erro genérico { // tratamento genérico } finally { // Este bloco de código sempre será executado, havendo ou não exceção! } Como tratar exceções • Vale ressaltar que é possível adicionar quantos catches forem necessários, ordenando sempre do mais específico para o mais genérico. • Quando uma exceção for gerada, apenas um bloco catch é executado, desviando o fluxo para o bloco finally (se este existir). • O bloco finally será sempre executado independente da ocorrência de uma exceção Exemplo try { // Código que gerará a exceção int x = 10; int y = 0; int z = x/y; //divisão por zero txtResult.Text = z.ToString(); // esta linha não será executada } catch (System.Exception e) { // Apresenta o erro txtResult.Text = e.Message; } finally { // Este bloco de código sempre será executado, ocorrendo ou não exceção! lblMsg.Text = “Bloco finally executado!”; } Gerando ou lançando Exceções • Vimos como tratar exceções, mas em alguns casos é necessário gerar exceções ou lançar essa exceção para que alguma classe acima trate-a. • Para isso utilizamos o comando throw • Exemplos: – throw new Exception(“descrição”); – throw new Exception(“descrição”, excecao_base); Gerando ou lançando Exceções • Para lançar uma exceção, simplesmente colocamos o comando: – throw; • Isso faz com que a exceção ocorrida seja “lançada”. Normalmente utilizamos esse recursos em classes onde o tratamento de exceção não é necessário, como por exemplo classes de acesso a BD. Nesse caso a classe de regras de negócio deveria tratar a exceção. Classes de Exceções definidas pelo usuário • Na maioria dos casos, as classes de exceção da .Net Framework são suficientes para o tratamento das exceções dos programas. Porém em alguns casos a necessidade de criação de novas classes de exceções existem. • Para criar novas classes de exceções é necessário que elas herdem direta ou indiretamente da classe ApplicationException. Exemplo using System; namespace RaizQuadradaTest { class NumeroNegativoException: ApplicationException { public NumeroNegativoException(): base( “Operação inválida para número negativo”) { } public NumeroNegativoException(string msg): base( msg) { } public NumeroNegativoException(string msg, Exception inner): base(msg, inner) { } } } Exemplo - Continuação • Método da classe herdada de Form public double RaizQuadrada(double valor) { if (valor < 0) { throw new NumeroNegativoException(“Não existe raiz quadrada de número negativo”); } else return Math.Sqrt(valor); } Exercício • Criar um programa para demonstrar a utilização das exceções criadas pelo usuário. Além das exceções criadas, o programa deve tratar outras exceções que possivelmente ocorrerão durante os testes. Por exemplo: FormatException. Ao capturar um erro, o programa deve exibir uma mensagem de erro ao usuário contendo. Bibliografia • http://www.msdnbrasil.com.br/Tecnologias /arquitetura/nova/blocos_disp/ger_exceco es/exceptdotnet.htm • www.msdnbrasil.com.br/docs/net/vstudio_ exceptions.doc • http://www.rodrigobytes.com.br/programac ao/ler.aspx?id=3&cat=8