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

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

Embed Size (px)

Citation preview

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

OO-SC (Meyer) - Cap 12 1

OO-SC (MEYER)Quando o contrato é quebrado:

tratamento de exceções

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

OO-SC (Meyer) - Cap 12 2

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.”

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

OO-SC (Meyer) - Cap 12 3

Conceitos básicos:

Falha 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”.

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

OO-SC (Meyer) - Cap 12 4

…Falha:

Uma operação tem sucesso se termina a sua execução satisfazendo o seu ‘contrato’. Ela falha se não tiver sucesso.

Exceção: é um evento de execução que pode ocasionar a falha de uma operação.

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

OO-SC (Meyer) - Cap 12 5

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

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

OO-SC (Meyer) - Cap 12 6

6. Verificar que a pós-condição falha7. Verificar que a invariante falha8. 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

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

OO-SC (Meyer) - Cap 12 7

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.”

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

OO-SC (Meyer) - Cap 12 8

Tratamento de exceções:(exemplo em ADA)

sqrt (n: REAL) return REAL isbegin

if x < 0.0 then raise Negative

elsecálculo_normal_da_raiz_quadrada

endexception

when Negative =>put (“Argumento Negativo”)return

when others => …end -- sqrt

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

OO-SC (Meyer) - Cap 12 9

Princípio do tratamento disciplinado de exceções:

Só existem duas respostas legítimas para uma exceção:

R1: Refazer (retrying): mudar as condições que levaram à exceção e executar a operação novamente

R2: Falha (pânico organizado): limpar o ambiente, terminar a chamada e reportar a falha ao chamador

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

OO-SC (Meyer) - Cap 12 10

“pânico organizado”:

Garantir que o chamador vai receber uma exceção! (pânico)

Restabelecer um estado consistente de execução (organizado):

>> garantir as invariantes antes de devolver o controle!

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

OO-SC (Meyer) - Cap 12 11

A cadeia de chamada:r0

r1

r2

r3

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

OO-SC (Meyer) - Cap 12 12

Um mecanismo de exceção:

Cláusula Rescue (resgate/salvamento): executada no caso de exceção (pré-condição, execução, pós-condição)

Cláusula Retry: re-inicia a rotina desde o início. Deve aparecer no âmbito da cláusula Rescue

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

OO-SC (Meyer) - Cap 12 13

Posição das cláusulas:rotina is

requirepré-condições

local-- declarações de entidade locais

do-- corpo

ensurepós-condições

rescuecláusulas_rescue

end

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

OO-SC (Meyer) - Cap 12 14

Princípio da falha:

“A execução de uma cláusula rescue até o final, não passando por uma instrução retry, leva a rotina corrente a falhar!”

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

OO-SC (Meyer) - Cap 12 15

Tabela de histórico de exceções:

Se uma rotina falha: Porque não tem uma cláusula rescue ou Porque 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

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

OO-SC (Meyer) - Cap 12 16

A cadeia de chamada:r0

r1

r2

r3

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

OO-SC (Meyer) - Cap 12 17

Exemplo: Input de valor inteiro

get_integer is-- Obter inteiro do usuário. -- Se incorreto pedir de novo

doprint (“Informe um inteiro: “)ler_um_inteiro

rescueretry

end

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

OO-SC (Meyer) - Cap 12 18

Input melhorado!Maximo_tentativas: INTEGER is 5Get_integer is

localtentativas: INTEGER

doif tentativas < Maximo_tentativas then

print (“Favor fornecer um inteiro: “)ler_um_inteirointeiro_foi_lido := True

elseinteiro_foi_lido := False

endrescue

tentativas := tentativas + 1retry

end

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

OO-SC (Meyer) - Cap 12 19

Falha de hardware / sistema operacional

Calcular a função:1

X

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

OO-SC (Meyer) - Cap 12 20

Falha de hardware/SO

quasi_inverse (x: REAL): REAL is-- 1/X, se possível; 0 (zero), caso contrário

localdivision_tried: BOOLEAN

doif not division_tried then

Result := 1/xend

rescuedivision_tried := Trueretry

end

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

OO-SC (Meyer) - Cap 12 21

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

doend