A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

OO-SC (Meyer) - Cap 121 OO-SC (MEYER) Quando o contrato é quebrado: tratamento de exceções.

Apresentações semelhantes


Apresentação em tema: "OO-SC (Meyer) - Cap 121 OO-SC (MEYER) Quando o contrato é quebrado: tratamento de exceções."— Transcrição da apresentação:

1 OO-SC (Meyer) - Cap 121 OO-SC (MEYER) Quando o contrato é quebrado: tratamento de exceções

2 OO-SC (Meyer) - Cap 122 Exceções Cedo ou tarde, apesar de todas as precauções tomadas, alguns eventos não esperados e não desejados vão acontecer. Isto é conhecido como uma exceção e devemos estar preparados para tratá-las.

3 OO-SC (Meyer) - Cap 123 Conceitos básicos: zFalha na definição correta de tratamento de exceções: Muitas vezes os mecanismos de tratamentos de exceções (em linguagens como ADA e PL/1) servem como instruções tipo goto, violando o princípio de Proteção Modular.

4 OO-SC (Meyer) - Cap 124 … zFalha: Uma operação tem sucesso se termina a sua execução satisfazendo o seu contrato. Ela falha se não tiver sucesso. zExceção: é um evento de execução que pode ocasionar a falha de uma operação.

5 OO-SC (Meyer) - Cap 125 Origem das exceções: 1.Tentar executar a.f e o objeto a não existe 2.Tentar ligar um objeto a outro que não existe 3.Executar uma operação que produz uma condição anormal detectada pelo hardware ou sistema operacional 4.Chamar uma operação que falha (*) 5.Verificar que a pré-condição falha

6 OO-SC (Meyer) - Cap 126 … 6.Verificar que a pós-condição falha 7.Verificar que a invariante falha 8.Verificar que a invariante de um loop não é satisfeita depois do from ou depois de uma iteração 9.Verificar que uma iteração de um loop não altera a variante 10.Executar um ckeck e verificar que a assertiva falhou 11.Executar uma instrução que gera exceção

7 OO-SC (Meyer) - Cap 127 Falhas e exceções: A falha em uma operação ocasiona uma exceção no seu chamador! Uma chamada a uma operação falha se e somente se ocorrer uma exceção durante a sua execução e a operação não se recuperar da exceção.

8 OO-SC (Meyer) - Cap 128 Tratamento de exceções: (exemplo em ADA) sqrt (n: REAL) return REAL is begin if x < 0.0 then raise Negative else cálculo_normal_da_raiz_quadrada end exception when Negative => put (Argumento Negativo) return when others => … end -- sqrt

9 OO-SC (Meyer) - Cap 129 Princípio do tratamento disciplinado de exceções: Só existem duas respostas legítimas para uma exceção: zR1: Refazer (retrying): mudar as condições que levaram à exceção e executar a operação novamente zR2: Falha (pânico organizado): limpar o ambiente, terminar a chamada e reportar a falha ao chamador

10 OO-SC (Meyer) - Cap 1210 pânico organizado: zGarantir que o chamador vai receber uma exceção! (pânico) zRestabelecer um estado consistente de execução (organizado): >> garantir as invariantes antes de devolver o controle!

11 OO-SC (Meyer) - Cap 1211 A cadeia de chamada: r0 r1 r2 r3

12 OO-SC (Meyer) - Cap 1212 Um mecanismo de exceção: zCláusula Rescue (resgate/salvamento): executada no caso de exceção (pré- condição, execução, pós-condição) zCláusula Retry: re-inicia a rotina desde o início. Deve aparecer no âmbito da cláusula Rescue

13 OO-SC (Meyer) - Cap 1213 Posição das cláusulas: rotina is require pré-condições local -- declarações de entidade locais do -- corpo ensure pós-condições rescue cláusulas_rescue end

14 OO-SC (Meyer) - Cap 1214 Princípio da falha: zA execução de uma cláusula rescue até o final, não passando por uma instrução retry, leva a rotina corrente a falhar!

15 OO-SC (Meyer) - Cap 1215 Tabela de histórico de exceções: zSe uma rotina falha: yPorque não tem uma cláusula rescue ou yPorque executa até o final sem passar por nenhum retry Interrompe a execução do chamador, que tem as duas opções: -Rescue c/ retry -Falha

16 OO-SC (Meyer) - Cap 1216 A cadeia de chamada: r0 r1 r2 r3

17 OO-SC (Meyer) - Cap 1217 Exemplo: Input de valor inteiro get_integer is -- Obter inteiro do usuário. -- Se incorreto pedir de novo do print (Informe um inteiro: ) ler_um_inteiro rescue retry end

18 OO-SC (Meyer) - Cap 1218 Input melhorado! Maximo_tentativas: INTEGER is 5 Get_integer is local tentativas: INTEGER do if tentativas < Maximo_tentativas then print (Favor fornecer um inteiro: ) ler_um_inteiro inteiro_foi_lido := True else inteiro_foi_lido := False end rescue tentativas := tentativas + 1 retry end

19 OO-SC (Meyer) - Cap 1219 Falha de hardware / sistema operacional zCalcular a função: 1 X

20 OO-SC (Meyer) - Cap 1220 Falha de hardware/SO quasi_inverse (x: REAL): REAL is -- 1/X, se possível; 0 (zero), caso contrário local division_tried: BOOLEAN do if not division_tried then Result := 1/x end rescue division_tried := True retry end

21 OO-SC (Meyer) - Cap 1221 Quando não existe uma clásula rescue? Class ANY -- mãe de todas as classes default_rescue is -- trata exceções no caso de não -- existir clásula rescue do end


Carregar ppt "OO-SC (Meyer) - Cap 121 OO-SC (MEYER) Quando o contrato é quebrado: tratamento de exceções."

Apresentações semelhantes


Anúncios Google