Programação Estruturada e Orientada a Objetos Tratamento de Exceções 2013
O que veremos hoje? Introdução Tratamento de exceções Exercícios Transparências baseadas no material do Prof. Gilbert Azevedo
Referencias Bibliográficas Introduction to C# Programming with Microsoft.Net Microsoft Official Course 2609A Microsoft Visual C# 2005 - Passo a passo John Sharp, Bookman, 2007 Microsoft Asp.Net Passo a passo George Sheperd, Bookman, 2007 Microsoft VS 2005 Express Edition Documentation
Conteúdo Erros e Exceções Tratamento de Exceções em C# Instruções Try, Catch e Finally Classes de Exceções Exceções Comuns do CLR - common language runtime Gerando Exceções com Throw Definindo Novas Exceções
Erros Os erros em sistema computacionais podem ocorrer por vários motivos Comportamento imprevisível de usuários Falhas de hardware Problemas de conexão ou comunicação Falta de direito de acesso a recursos Erros de memória, alocação, estouro de capacidade Abordagens antigas utilizavam variáveis globais para identificar o erro A lógica do programa fica entrelaçada com o código do erro Códigos de erro numéricos não são significativos Condições de erro eram pouco documentadas
Exceções Linguagens de programação modernas sinalizam os erros utilizando exceções Exceções são objetos especiais que indicam um comportamento inesperado, interrompendo o fluxo de normal execução Tratamento robusto dos erros Separação do código principal do programa e do código da manipulação de erros Diferentes tipos de erros produzem objetos de exceções de classes distintas As classes de exceções são organizadas em uma hierarquia
Tratamento de Exceções O tratamento de exceções no C# é realizado através das instruções try-catch-finally try { // Instruções a serem executadas catch (TipoExceção erro) { // Tratamento de exceções de um tipo específico catch (Exception erro) { // Tratamento genérico de exceções finally { // Instruções sempre executadas, ocorram ou não erros
Bloco Try O bloco try é um bloco de execução protegida onde deve ser implementado o fluxo principal do programa O bloco try é obrigatório O C# tentará executar todas as instruções no bloco try Se nenhuma instrução gerar uma exceção, todas serão executadas Se ocorrer algum erro, a execução é pulada para os blocos catch ou finally. As instruções restantes no try são ignoradas Se nenhum catch capturar a exceção, ela é capturada pelo CLR e a execução do aplicativo pode ser encerrada, dependendo do tipo de erro
Bloco Catch O bloco catch é o bloco de manipulação da exceção onde devem ser implementados os tratamentos de erro O bloco catch é opcional Um bloco try pode possuir vários blocos catch Os manipuladores devem ser escritos do mais específico para o mais genérico A classe mais genérica de erro é a Exception A exceção é consumida no bloco catch, ou seja, a priori apenas um catch é executado
Bloco Finally No bloco finally são incluídas as instruções que devem necessariamente ser executadas, ocorram ou não erros O bloco finally é opcional Um bloco try possui apenas um bloco finally Blocos finally são utilizados para liberação de recursos como manipuladores de arquivos e conexões com bancos de dados Numa execução sem erros são executados os blocos try e finally Numa execução com erros são executados os blocos try (parcialmente), catch (de acordo com o tipo do erro) e finally (sempre)
Exemplo com Try Catch int a, b, c; try { a = int.parse(console.readline()); b = int.parse(console.readline()); c = (a / b); catch (FormatException erro) { Console.WriteLine("O valor digitado não é um número"); Console.WriteLine(erro.Message); catch (DivideByZeroException erro) { Console.WriteLine("Divisão por zero"); Console.WriteLine(erro.Message);
Exemplo com Try Finally string s; StreamReader file; file = new StreamReader(aArquivo, Encoding.Default); try { while ((s = file.readline())!= null) Console.writeline(s); finally { file.close();
Classes de Exceções Todas as exceções em C# são descendentes da classe System.Exception As exceções do CRL derivam de System.SystemException As exceções do usuário devem ser descendentes da classe System.ApplicationException catch (DivideByZeroException erro) { Console.wirteLine( erro.gettype().tostring()+"\r\n"+ erro.gettype().basetype.tostring()+"\r\n"+ erro.gettype().basetype.basetype.tostring()+"\r\n"+ erro.gettype().basetype.basetype.basetype.tostring()+"\r\n"+ erro.gettype().basetype.basetype.basetype.basetype.tostring());
Exceções Comuns do CLR
Levantando Exceções com Throw As exceções são levantadas (geradas) através da instrução throw seguida de um objeto de erro private string nomemes(int mes) { switch (mes) { case 1: return "Janeiro"; case 2: return "Fevereiro"; case 12: return "Dezembro"; default: throw new ArgumentOutOfRangeException ("Mês inválido");
Definindo Novas Exceções Para definir novas exceções é necessário descender uma classe de ApplicationException Definindo a classe public class EIdadeInvalida : ApplicationException { public EIdadeInvalida(string message): base(message) { Levantando a exceção throw new EIdadeInvalida("Idade mínima: 18 anos");
Dúvidas