oo-sc (meyer) - cap 121 oo-sc (meyer) quando o contrato é quebrado: tratamento de exceções
TRANSCRIPT
OO-SC (Meyer) - Cap 12 1
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.”
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”.
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.
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
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
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.”
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
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
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!
OO-SC (Meyer) - Cap 12 11
A cadeia de chamada:r0
r1
r2
r3
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
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
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!”
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
OO-SC (Meyer) - Cap 12 16
A cadeia de chamada:r0
r1
r2
r3
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
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
OO-SC (Meyer) - Cap 12 19
Falha de hardware / sistema operacional
Calcular a função:1
X
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
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