Você está na página 1de 10

Programao Orientada a Objetos

Tratamento de Excees
Este captulo apresenta inicialmente os fundamentos de tolerncia a falhas, incluindo os conceitos de falha, erro, defeito, componente ideal tolerante a falhas, excees e tratamento de excees. Em seguida descrito o mecanismo de tratamento de excees de Java com exemplo de sua aplicao.Ao final deste captulo o estudante dever ser capaz de codificar mtodos que devam lanar ou capturar excees Java. 12.1. Motivao: Tolerncia a Falhas 12.1.1. Conceitos de Falha, Erro e Defeito Quando um componente de um sistema computacional ou o sistema como um todo deixa de oferecer as funcionalidades previstas ou o faz em desacordo com sua especificao, dizemos que ele tem um defeito (failure). Por exemplo, h um defeito num caixa eletrnico quando ele no permite que um cliente do banco realize um saque nas condies de seu contrato. Um defeito , portanto, algo observvel externamente a um componente ou sistema defeituoso. Como o comportamento de cada componente de um sistema computacional funo do seu estado interno e das entradas que recebe, a ocorrncia de um defeito pode ser associada a um estado interno que, sob determinadas entradas, provoca o defeito. Idealmente, todos os componentes de um sistema deveriam ser projetados e construdos de modo que nunca pudessem ser levados a um estado que propicie a ocorrncia de defeito. Quando se observa tal estado, dizemos que h um erro (error) no componente. Por exemplo, o saque solicitado pelo cliente pode ser negado em funo de um valor incorreto do saldo de sua conta. Um erro , portanto, de natureza esttica e interno ao componente do sistema, podendo ou no vir a provocar um defeito. A causa de um erro chamada de falha (fault). Por exemplo, um valor incorreto para o saldo da conta do cliente poderia ter sido causado por uma falha na transmisso dos dados entre o computador do banco e o caixa eletrnico. Uma falha , portanto, um evento ou seqncia de eventos que propicia o surgimento de um erro num componente do sistema. A Figura 1.1 ilustra como esses trs conceitos esto relacionados: ocorrncia de uma falha (Figura .1.1(a)) provoca um erro no estado do sistema (Figura .1.1(b)), que se propaga at afetar o seu comportamento, resultando num defeito (Figura .1.1(c)). 12.1.2. Sistemas Tolerantes a Falhas Tolerncia a falhas (fault tolerance) definida como a capacidade de um sistema computacional de preservar suas funcionalidades, sem apresentar defeitos, mesmo na presena de falhas. As tcnicas de tolerncia a falhas em sistemas computacionais surgiram junto com os primeiros computadores e foram aplicadas extensivamente para aumentar a disponibilidade e confiabilidade dos componentes de hardware. Com a utilizao de computadores em sistemas chamados de misso crtica (safety critical systems), os requisitos de alta confiabilidade e disponibilidade tornaram-se primordiais.
1

Programao Orientada a Objetos

Aplicaes em pesquisa espacial, controle de ferrovias, aviao, usinas nucleares e medicina foram, nas ltimas dcadas, os principais motivadores do desenvolvimento das tcnicas de tolerncia a falhas, que passaram a incluir tambm mecanismos de software.

Fig. .1.1 - Falha, Erro e Defeito

A expanso do uso de computadores por praticamente todas as reas de atividades em nossa sociedade elevou os riscos associados a inmeros outros sistemas, justificando a rpida expanso das tcnicas de tolerncia a falhas para alm da fronteira dos sistemas de misso crtica. Se considerarmos ainda a interao entre os aspectos de usabilidade e tolerncia a falhas falhas provocadas por problemas de usabilidade e vice-versa - podemos esperar, para um futuro prximo, que a presena de mecanismos de tolerncia a falhas nos novos sistemas torne-se to corriqueira quanto o uso de interfaces grficas. To ou mais importante que a adoo de tcnicas de tolerncia a falhas a sua preveno (fault prevention), atravs de tcnicas e mtodos adequados aplicados na anlise, projeto, programao, testes e funcionamento de um sistema computacional. 1.3. Tratamento de Excees O significado mais geral de exceo, segundo o dicionrio Aurlio, : Exceo: Desvio da regra geral. Aquilo que se exclui da regra. Em sistemas de computao, uma exceo pode modelar uma condio de erro detectada pelo sistema. Por exemplo, se, ao efetuar a leitura de um setor do disco, o sistema operacional detecta alguma inconsistncia nos dados lidos, atravs de um cdigo CRC (cyclic redundancy check) por exemplo, dizemos que lanada (ou levantada) uma exceo. Uma vez lanada uma exceo, um sistema ideal tolerante a falhas deve prover os meios necessrios para que as seguintes aes sejam executadas: (i) identificar a causa do erro, ou seja, diagnosticar qual a falha que provocou o estado errneo;

Programao Orientada a Objetos

(ii) determinar qual o agente da falha, ou seja, identificar que componente do sistema, ou qual agente externo, falhou; (iii) isolar o agente que falhou, ou seja, desfazer as conexes que ligam o componente, ou agente externo, ao sistema, para evitar que a falha continue a afetar o sistema; (iv) determinar a extenso do erro, ou seja, identificar as partes do estado do sistema que foram afetadas; (v) recuperar o estado do sistema, ou seja: corrigir o estado interno do sistema, para eliminar o erro; (vi) reconfigurar o sistema, de forma a permitir a retomada do processamento normal sem o componente, ou agente externo, que falhou; (vii) reiniciar o processamento normal. Esse conjunto de aes denominado, genericamente, tratamento de excees. A Figura 1.3 ilustra o lanamento de uma exceo, quando detectado um erro, e o tratamento dessa exceo, isolando o agente que falhou e recuperando o estado correto do sistema. Voltando ao exemplo da exceo levantada por um erro de leitura do disco, um possvel tratamento dessa exceo seria: (i) efetuar uma nova leitura do mesmo setor do disco para verificar se uma falha intermitente, por exemplo, ocorrida na transmisso dos dados entre o disco e o sistema, ou se uma falha permanente; (ii) se for uma falha permanente, efetuar a leitura de outros setores variando a sua localizao no disco, para identificar se a falha no setor, numa trilha do disco, numa cabea de gravao ou no dispositivo como um todo; (iii) alterar o mapa do disco marcando os setores defeituosos para impedir outros acessos aos mesmos; (iv) verificar em todos os buffers do sistema se existem dados lidos dos setores considerados defeituosos; (v) invalidar todos os buffers que contenham tais dados; (vi) na tabela de alocao de arquivos, substituir por outros setores do disco os setores defeituosos que pertenciam a algum arquivo, recuperando seus dados a partir de uma cpia atualizada dos mesmos; (vii) efetuar a leitura do setor que substituiu o que levantou a exceo, e prosseguir na execuo normal do sistema, como se a falha no houvesse ocorrido. 1.4. Componente Ideal Tolerante a Falhas Arquiteturas de sistemas em camadas so apropriadas para a introduo de mecanismos de tolerncia a falhas, pois esse estilo arquitetural permite particionar o modelo de falhas do sistema como um todo em diversos modelos menores e mais fceis de serem tratados. Isso possvel porque os sistema estruturado de tal maneira que cada camada s precisa conhecer e tratar as falhas provenientes da camada imediatamente inferior. Num sistema de banco de dados, por exemplo, a camada mais inferior pode incluir o tratamento de falhas de leitura ou gravao, provendo
3

Programao Orientada a Objetos

os mecanismos para recuperao desse tipo de falha. Com isso, as camadas superiores, como a interface com os usurios, podem excluir esse tipo de falha do seu modelo de falhas.

Fig. 1.3 - Tratamento de Exceo

Lee e Anderson [Lee90] definem um modelo geral para componentes de software tolerantes a falhas utilizando esse mesmo princpio. Um componente qualquer do sistema visto como um fornecedor de servios, que responde a requisies que recebe. A resposta a uma requisio pode ser normal ou anormal. Uma resposta anormal resultado de alguma falha que no pode ser tratada pelo componente. Simetricamente, quando um componente requisita um servio, pode receber uma resposta normal ou anormal, devendo conter mecanismos para o tratamento de ambos os tipos de respostas. A figura .1.4 apresenta esquematicamente esse modelo de componente, denominado componente ideal tolerante a falhas. 12.2. Mecanismos de Tratamento de Excees A maior parte das linguagens de programao utilizadas em aplicaes comerciais no oferece um suporte adequado para tratamento de excees, prevendo apenas a interrupo do processamento quando um erro grave detectado. Essas interrupes podem significar grandes prejuzos, como a impossibilidade de se realizar transaes essenciais para o negcio do cliente, e custos de operao e suporte tcnico elevados, para diagnstico das falhas, recuperao do estado da aplicao e reincio do processamento. Em aplicaes crticas, como no controle de trfego areo, essas interrupes podem ser intolerveis, exigindo a utilizao de linguagens de programao que permitam o tratamento das excees automaticamente pelo prprio sistema, de modo a mant-lo em operao contnua e segura.

Programao Orientada a Objetos

Fig. .1.4 - Componente Ideal Tolerante a Falhas

Ada e C so exemplos de linguagens de programao antigas que oferecem suporte para mecanismos para tratamento de exceo e, por isso mesmo, ainda so as mais utilizadas no desenvolvimento de aplicaes com requisitos de tolerncia a falhas elevados. A incluso desse tipo de mecanismo uma clara tendncia em todas as linguagens mais modernas, incluindo Java. Os mecanismos de tratamento de excees existentes nessas linguagens, porm, diferem entre si. Nas sees seguintes, iremos apresentar resumidamente alguns dos aspectos mais relevantes de tais mecanismos, cuja compreenso indispensvel para sua correta utilizao. 2.1. Representao das Excees Um dos objetivos dos mecanismos de tratamento de excees simplificar o cdigo fonte atravs da separao das rotinas de tratamento das excees daquelas responsveis pelo processamento normal. Sendo assim, uma vez detectada uma condio excepcional, esta deve ser codificada e deve ser criada uma representao da mesma que possa ser tratada em outro ponto do programa. Isso pode ser feito de duas formas: (i) utilizando-se um conjunto de smbolos que identificam genericamente o tipo da exceo, como IO_ERROR e OVERFLOW; ou (ii) utilizando-se uma representao mais especfica de cada tipo de exceo, como mensagens ou objetos com atributos descritivos da exceo. Em Java, as excees so representadas como objetos, o que oferece uma maior flexibilidade e permite a incluso de informaes relativas ao contexto em que ocorreu a exceo. 2.2. Assinaturas de Mtodos As linguagens orientadas a objetos divergem no que diz respeito a se os tipos das excees que podem ser recebidas como conseqncia da chamada de um mtodo (excees externas) devem fazer parte da assinatura desse mtodo, tal como ocorre com o tipo do seu resultado normal. Para essa questo, h quatro alternativas possveis:

Programao Orientada a Objetos

(i) no incluir na assinatura do mtodo os tipos de suas excees externas; (ii) permitir, opcionalmente, que os tipos de excees externas sejam includos na assinatura do mtodo; (iii) incluir, obrigatoriamente, todos os tipos de excees externas na assinatura do mtodo; (iv) incluir, obrigatoriamente, apenas alguns tipos de excees externas e deixar opcional a incluso dos outros tipos na assinatura do mtodo (modelo hbrido). A obrigatoriedade dessa incluso visa assegurar que as excees sejam tratadas de maneira explcita pelos programas, eliminando-se a ocorrncia de excees para as quais no esteja previsto um tratamento adequado. Por outro lado, tal obrigatoriedade implica na proliferao de rotinas de tratamento de excees. Java utiliza um modelo hbrido onde algumas classes de excees externas devem ser obrigatoriamente includas nas assinaturas dos mtodos e as demais podem ser includas opcionalmente. 3. Contextos dos Tratadores de Excees Mecanismos de tratamento de excees mais rudimentares como o do sistema operacional MS-DOS, baseado em interrupes, permitem que se declare apenas uma rotina de tratamento para cada tipo de exceo, independentemente do contexto onde ela venha a ocorrer. Qualquer exceo do tipo ARITHMETIC_OVERFOW, por exemplo, tratada por uma mesma rotina, que deve ser capaz de recuperar o contexto onde a exceo ocorreu e decidir pela ao a ser adotada naquele caso. Os mecanismos mais sofisticados permitem definir vrios tratadores para um mesmo tipo de exceo, cada qual associado a um determinado contexto de execuo. Dependendo do mecanismo, nas linguagens orientadas a objeto esse contexto pode ser desde toda uma classe at um nico comando da linguagem. Quanto menor a granularidade permitida, mais especializados e, conseqentemente, mais simplificados podem ser os tratadores. Em Java, os tratadores de excees so associados a blocos de comandos, que podem conter desde um nico comando at todo o corpo de um mtodo. 3.1. Propagao de Excees Como j vimos anteriormente, uma exceo deve ser tratada num ponto do programa o mais prximo possvel daquele em foi criada. Idealmente, o tratador deve estar no mesmo mtodo que criou a exceo, de modo a produzir o resultado normal esperado pela chamada do mtodo e evitar que uma resposta excepcional seja recebida por quem o chamou. Se isso no for possvel, a exceo deve ser tratada por quem chamou o mtodo. Alguns mecanismos de tratamento de excees exigem que isso acontea dessa forma. Ou seja, para toda chamada de mtodo cuja assinatura declare algum tipo de exceo externa, deve haver um tratador apropriado no mtodo que faz a chamada.
6

Programao Orientada a Objetos

Outros mecanismos de tratamento de excees permitem que esses tratadores sejam omitidos, propagando automaticamente as excees para as quais no sejam encontrados tratadores apropriados no mtodo anterior da pilha de execuo. O mecanismo de tratamento de excees de Java permite que excees sejam propagadas automaticamente, o que exige uma disciplina mais rgida por parte do programador para evitar que isso ocorra de maneira indiscriminada. 3.2. Continuao do Fluxo de Controle Um dos aspectos mais importantes de um mecanismo de tratamento de excees como a seqncia de execuo do programa afetada aps o lanamento de uma exceo. Existem dois modelos bsicos: o modelo de continuao (resumption) e o de terminao (termination). Em ambos os modelos, o lanamento de uma exceo desvia o fluxo de execuo para um tratador apropriado. O que os distinge a seqncia do fluxo de execuo aps o trmino do tratador. No modelo de continuao, a execuo prossegue a partir do comando seguinte ao que provocou a exceo, ou seja: o fluxo de execuo normal mantido, como se no houvesse ocorrido a exceo. Supe-se, nesse caso, que o tratador executado capaz de mascarar a exceo, de modo, que o processamento continue como se ela no houvesse ocorrido. No modelo de terminao, a execuo prossegue a partir do final do bloco que contm o comando que provocou a exceo, ou seja, o fluxo de execuo normal interrompido no ponto em que ocorreu a exceo e reiniciado a partir do prximo bloco. Supe-se, nesse caso, que a ocorrncia de uma exceo pode invalidar parte do fluxo normal de execuo, que deve ser retomado em algum ponto mais adiante. O modelo de terminao mais realista, pois raramente o fluxo normal de execuo pode ser mantido inalterado aps uma exceo. Alm disso, caso o bloco contenha um nico comando, a seqncia de execuo no modelo de terminao equivalente do modelo de continuao. Por tudo isso esse modelo considerado superior e o adotado por Java.

4. Tratamento de Excees em Java 4.1. A Hierarquia de Classes de Excees As excees em Java so representadas por objetos das classes da hierarquia de Throwable, representada na figura 4.1. Embora seja possvel instanciar objetos da classe Throwable, normalmente as excees so instanciadas sempre a partir de suas subclasses, por exemplo, Error, Exception RuntimeException. e

Programao Orientada a Objetos

Fig. 12.4.1 - Hierarquia de Classes Throwable

A classe Error abrange as excees catastrficas que geralmente no podem ser tratadas pela aplicao, tal como uma condio de erro na prpria mquina virtual Java (VirtualMachineError). A classe Exception abrange as excees da aplicao, que podem ser capturadas e tratadas pela aplicao, tais como um erro de I/O (IOException) ou uma diviso por zero (ArithmeticException). A classe RuntimeException, derivada de Exception, abrange as excees lanadas pela mquina virtual Java em conseqncia de erros no cdigo do programa, tais como o uso de uma referncia nula (NullPointerException) ou uma diviso por zero (ArithmeticException). As excees das classes Error e RuntimeException e suas respectivas subclasses, so ditas "unchecked" (no verificadas) pois Java no obriga que sejam tratadas pelo programa, embora isso possa (e muitas vezes deva) ser feito. J para as excees das outras subclasses de Exception obrigatria, nos mtodos onde possam ocorrer tais excees, a existncia de tratadores apropriados (estruturas try / catch) ou, alternativamente, a incluso das classes de excees nas assinaturas daqueles mtodos, como veremos adiante neste captulo. 4.2. Criando e Lanando Excees As excees definidas por uma aplicao normalmente so representadas por objetos da classe Exception ou de subclasses da mesma definidas pela aplicao para incluir atributos e mtodos especficos daquele tipo de exceo. Eventualmente uma aplicao tambm pode definir excees derivadas da classe Error, se consideradas irrecuperveis, o que deve ser evitado sempre que possvel.
8

Programao Orientada a Objetos

Antes de lanar uma exceo, precisamos criar o objeto da classe que descreve a exceo. Para isso utilizamos o comando new, como para qualquer outro objeto. O objeto criado pode ento ser lanado atravs do comando throw , de acordo com a seguinte sintaxe:

Normalmente isso feito num mesmo comando, que cria e lana a exceo, como no exemplo abaixo:

4.3. Definindo Tratadores de Excees Java permite a definio de tratadores de excees associados a blocos de comandos, de modo que excees de uma mesma classe possam ser tratadas diferentemente, dependendo do comando ou trecho de programa onde venham a ocorrer. Esses tratadores de excees so definidos atravs de estruturas try / catch, de acordo com a seguinte sintaxe:

O cdigo seguinte ilustra o uso dessa estrutura:

O primeiro bloco, logo aps a palavra chave try, delimita os procedimentos para os quais o tratamento de excees definido nessa estrutura ser aplicado. A clusula catch define um tratador para uma classe de excees especificada. Uma estrutura try / catch pode conter diversos tratadores, para diferentes classes de excees. Um bloco catch definido para uma classe genrica, como Exception ou RuntimeException por exemplo, pode tratar tanto as excees daquela classe como de suas subclasses. A busca do tratador para uma dada exceo se processa na ordem em que os blocos catch aparecem na estrutura, sendo selecionado o primeiro catch cuja classe abranja aquela exceo.

Programao Orientada a Objetos

Por esse motivo, havendo mais de um bloco catch para um mesmo bloco try eles devem estar ordenados do mais especfico para o mais genrico, como no exemplo abaixo:

10

Você também pode gostar