RTP

advertisement
RTP
Real-Time Programmatuur
hoofdstuk 6:
uitzonderingen
en de behandeling van
uitzonderingen
Yolande Berbers
Programmatuur voor real-time controle
slide 1
RTP

uitzonderingen
behandelen van uitzondering:
 dynamische redundantie
(= wordt uitgevoerd enkel als dwaling opgemerkt wordt)
 vorm van voorwaarts herstel: men probeert vanuit de situatie
met dwaling een goed functionerende toestand te bereiken
 kan ook gebruikt (misbruikt) worden voor achterwaarts herstel

terminologie
 uitzondering: het optreden van een dwaling
(in het Engels: exception)
 een uitzondering signaleren (of werpen): de oproeper van een
operatie attent maken op de uitzondering
(in het Engels: raising, signalling, throwing)
 behandeling (of opvang) v. uitzondering: actie die oproeper neemt
Yolande Berbers
Programmatuur voor real-time controle
slide 2
RTP
vereisten voor uitzonderingsmechanisme

V1. eenvoudig en gemakkelijk te gebruiken

V2. redundante code mag de normale code niet moeilijk te
begrijpen maken
 geen mengeling v. behandelen v. uitzonderingen met normale code

V3. enkel run-time overhead bij optreden van uitzondering
 soms compromis tussen snel herstel en overhead bij normale gang

V4. uniforme behandeling van uitzonderingen gesignaleerd
door omgeving en door toepassing zelf
 vb overflow en waarde buiten beperking op zelfde manier behandelen

V5. moet mogelijk maken om herstelacties te programmeren
Yolande Berbers
Programmatuur voor real-time controle
slide 3
RTP

behandeling van uitzonderingen in oudere
programmeertalen
routine geeft ongewone waarde of fout-code terug
 wordt veel gedaan in C (vaak test op -1)
if (function_call (parameters) == AN_ERROR) {
-- error handling code
} else {
-- normal code
}
 voldoet aan V1 (eenvoud) en V5 (behandeling van uitzondering)
 voldoet niet aan V2, V3 en V4: de code staat in de weg, er is
telkens overhead, mechanisme laat niet toe fouten door
omgeving op te vangen
Yolande Berbers
Programmatuur voor real-time controle
slide 4
RTP

behandeling van uitzonderingen in oudere
programmeertalen
verplichte sprong
 vooral gebruikt in assembler talen
 voldoet niet aan V2, V3 en V4

niet-lokale goto
 goto wordt beschouwd als heel slechte programmeringstechniek
 voldoet niet aan V1, V2 en V4

gebruik van een variabele voor een foutbehandelings-routine
 iets beter als niet-lokale goto
 voldoet ook niet aan V1, V2 en V4

voor rest van hoofdstuk: behandeling van uitzonderingen in
moderne programmeertalen (met hiervoor taalconstructies)
Yolande Berbers
Programmatuur voor real-time controle
slide 5
RTP uitzonderingen en hun voorstelling

dwaling-detectie kan gebeuren
 door omgeving
 door toepassing

signaleren van uitzondering kan gebeuren
 synchroon (direct bij mislukken operatie)
 asynchroon (een tijdje later, eventueel door een ander proces)

4 mogelijke klassen van uitzonderingen
(zie volgende transparant)
Yolande Berbers
Programmatuur voor real-time controle
slide 6
RTP

uitzonderingen en hun voorstelling
1. detectie door omgeving en synchrone verwittiging
 bv buiten het bereik van een rij gaan (detectie door run-time)
 bv deling door 0 (detectie door besturingsysteem)

2. detectie door toepassing en synchrone verwittiging
 bv niet voldoen aan een assertie

3. detectie door omgeving en asynchrone verwittiging
 bv stroomonderbreking van een meettoestel

4. detectie door toepassing en asynchrone verwittiging
 bv proces A merkt dat proces B niet meer reageert


asynchrone uitzonderingen: ook signalen genoemd, zie Hdst 11
in Hdst 6 behandelen we verder enkel de synchrone verwittiging
Yolande Berbers
Programmatuur voor real-time controle
slide 7
RTP


intermezzo: besturingssysteem en run time systeem
een programma draait bovenop een run-time systeem
(soms afgekort als RTS)
het run-time systeem draait bovenop het
besturingssysteem
programma
run-time systeem
code gegenereerd
door compiler
besturingssysteem
hardware
Yolande Berbers
Programmatuur voor real-time controle
slide 8
RTP

uitzonderingen en hun voorstelling
2 modellen voor declaratie van uitzonderingen
 Ada: een naam die als constante gedeclareerd is
package Standard is -- module van runtime systeem (RTS)
….
-- uitzonderingen door RTS gedetecteerd
Constraint_Error: exception;
Program_Error: exception;
Storage_Error: exception;
Tasking_Error: exception;
….
end Standard;
 Java: object van bepaald type, al dan niet expliciet gedeclareerd

Yolande Berbers
OO-kijk (alles is een object, ook een uitzondering)
Programmatuur voor real-time controle
slide 9
RTP
het domein van een exception handler

handler = stuk code die uitzondering opvangt

in een programma kunnen meerdere handlers voorzien
worden voor eenzelfde uitzondering
 bv deling door 0 kan op meerdere plaatsen opgevangen worden

met elke handler is een domein geassocieerd
 = stuk programma waarvoor opvangcode verantwoordelijk is
 als fout in domein optreedt wordt bijhorende handler geroepen

precisie van domein
 bepaalt hoe goed een fout kan gelokaliseerd worden
Yolande Berbers
Programmatuur voor real-time controle
slide 10
RTP

het domein van een exception handler
in blok-gestructureerd programmeertalen:
domein is blok, procedure, functie
 bv in Ada:
declare
subtype Temperature is Integer range 0 .. 100;
begin
-- lees temperatuurmeter en bereken zijn waarde
exception
-- handler voor Constraint_Error
end ;
 nadeel: granulariteit is soms te grof
(zie voorbeeld 2 slides verder)
Yolande Berbers
Programmatuur voor real-time controle
slide 11
RTP

het domein van een exception handler
in sommige andere talen: domein expliciet gespecifieerd
 men noemt het stuk code ‘bewaakt’ (guarded)
 bv in Java
try {
// stuk programma dat een uitzondering zou kunnen veroorzaken
}
catch (ExceptionType e) {
// code voor het opvangen van de uitzondering
}
 nadeel: past minder samen met natuurlijke structuur van code
Yolande Berbers
Programmatuur voor real-time controle
slide 12
RTP

het domein van een exception handler
voorbeeld van probleem door te weinig precisie
declare
subtype Temperature is Integer range 0 .. 100;
subtype Pressure is Integer range 0 .. 50;
subtype Flow is Integer range 0 .. 200;
begin
-- lees temperatuurmeter en bereken zijn waarde
-- lees drukmeter en bereken zijn waarde
-- lees doorvoermeter en bereken zijn waarde
-- pas temperatuur, druk en doorvoer aan volgens specificaties
exception
-- handler voor Constraint_Error
end ;
 handler weet niet welke instructie een beperkingsfout
veroorzaakt heeft
Yolande Berbers
Programmatuur voor real-time controle
slide 13
RTP


het domein van een exception handler
zeer lange
en weinig
elegante
oplossing
declare
subtype Temperature is Integer range 0 .. 100;
subtype Pressure is Integer range 0 .. 50;
begin
begin
-- lees temperatuurmeter en bereken zijn waarde
exception
-- handler voor Constraint_Error
end ;
begin
-- lees drukmeter en bereken zijn waarde
exception
-- handler voor Constraint_Error
end ;
-- pas temperatuur en druk aan volgens specificaties
exception
-- handler voor Constraint_Error
end ;
in Java: exception is een object dat informatie kan bevatten, zodat
handler meer kan weten over fout
Yolande Berbers
Programmatuur voor real-time controle
slide 14
RTP

propagatie van fouten
wat als er geen handler voorzien is voor een fout
 2 mogelijke aanpakken
compiler signaleert dit
 compiler moet testen of alle blokken alle fouten opvangen
 alle fouten overal opvangen zou heel veel code vragen
 ook weet een procedure vaak niet hoe een fout moet
behandeld worden: oproeper van de procedure weet dat
 fout propageren naar oproepende blokken
 2 modellen
– resumption model
– termination model
 speciale problemen bij meerdere processen: H 10

Yolande Berbers
Programmatuur voor real-time controle
slide 15
RTP

propagatie van fouten
resumption model:
 stuk programma waar fout optrad wordt hervat (op plaats waar
fout optrad) na opvang van de fout
 ‘oproeper’ kan verder uitvoeren alsof niets gebeurde

termination model
 stuk programma waar fout optrad wordt niet hervat
 controle gaat naar oproepend of omsluitend blok

hybrid model
 handler beslist voor stoppen of hervatten v code waarin fout optrad

volgende slides: tekening bij resumption en termination model
Yolande Berbers
Programmatuur voor real-time controle
slide 16
propagatie van fouten:
resumption
RTP
P
1 P roept Q op
2 Q roept R op
5 vanuit Hq gaat
het verder in Hr
6 vanuit Hr gaat
het verder in R
Q
R
Q
Hq
Hr
4 tijdens het behandelen van
uitzondering r treedt uitzondering
q op die niet lokaal opgevangen
wordt: propagatie naar Q
Yolande Berbers
3 uitzondering r treedt op in R
maar wordt niet opgevangen in R:
propagatie naar oproeper waar
wel een handler voorzien is
Programmatuur voor real-time controle
slide 17
RTP
propagatie van fouten:
resumption

mogelijke vergelijking: impliciet opgeroepen procedure

probleem met resumption model
 vaak moeilijk om het probleem helemaal op te lossen zodat je
ongestoord kunt verder gaan met de volgende instructie
 implementatie is moeilijk

mogelijk alternatief
 heruitvoeren van hele blok waar handler mee geassocieerd is
Yolande Berbers
Programmatuur voor real-time controle
slide 18
propagatie van fouten:
termination
RTP

model
 stuk programma waar fout optrad wordt niet hervat
 controle gaat naar oproepend of omsluitend blok
 manier waarop (conditie) controle terugkeert:


normaal (de uitzondering is volledig opgelost)

uitzondering (de uitzondering wordt doorgegeven)
voorbeelden
 voorbeeld met blok: volgende transparant
 voorbeeld met procedures: twee transparanten verder
Yolande Berbers
Programmatuur voor real-time controle
slide 19
RTP
propagatie van fouten:
termination
declare
subtype Temperature is Integer range 0 .. 100;
begin
….
begin
-- lees temperatuurmeter en bereken zijn waarde
exception
-- handler H1 voor Constraint_Error
end ;
-- code uitgevoerd bij normaal uittreden blok of na
-- behandeling van uitzondering in handler H1
exception
-- handler voor andere soorten uitzonderingen
end ;
Yolande Berbers
Programmatuur voor real-time controle
slide 20
propagatie van fouten:
termination
RTP
P
1
2
P roept Q op
Q
3
4
uitzondering q
treedt op
7
6
5
Yolande Berbers
Hq
Programmatuur voor real-time controle
slide 21
propagatie van fouten:
termination
RTP
P
1
4
2
R
Q roept
R op
P roept Q op
Q
5
3
9
uitzondering
r treedt op
8
6
7
Yolande Berbers
Hr
Programmatuur voor real-time controle
slide 22
RTP

uitzonderingen en besturingssysteem
meeste programma’s worden uitgevoerd boven een
besturingssysteem
 deze systemen ontdekken sommige synchrone fouten
bv illegale instructie
 deling door 0
 foutief adres (memory violation)
 mogelijke behandeling
 stoppen van proces (meest voorkomend)
 verwittigen van proces (bv via signals in POSIX)
 proces kan handler voorzien
 volgt het resumption model
 als dit voorkomt binnen een taal met termination model:
run-time systeem moet dit vertalen naar termination model

Yolande Berbers
Programmatuur voor real-time controle
slide 23
RTP gebruik van uitzonderingen in Ada

Ada model
 expliciete declaratie van uitzonderingen
 termination model
 propagatie van onbehandelde uitzonderingen
 beperkte vorm van parameters (dit bekijken wij niet in detail)

declaratie van een uitzondering
 naam_uitzondering: exception;
 of via package Ada.Exceptions (dit bekijken wij niet in detail)
 zoals variabelen hebben ook uitzonderingen hun zichtbaarheid (scope)
 enkele standaard uitzonderingen zijn door de taal gedefinieerd
en hebben zichtbaarheid over het hele programma
 bv Constraint_Error, Storage_error
Yolande Berbers
Programmatuur voor real-time controle
slide 24
RTP gebruik van uitzonderingen in Ada

signaleren van een uitzondering
 een toepassing kan ook expliciet een uitzondering signaleren
 raise instructie
begin
….
-- instructies die iets lezen van een randapparaat
if IO_Device_In_Error then
raise IO_Error;
end if ;
….
end ;
 een else-gedeelte is niet nodig want de controle komt niet terug
Yolande Berbers
Programmatuur voor real-time controle
slide 25
RTP gebruik van uitzonderingen in Ada

behandeling van uitzonderingen
 elk blok (en dus ook elke routine) kan optioneel een aantal
exception handlers bevatten
 ze worden aan het einde van het blok geschreven
 ze gebruiken sleutelwoord when om uitzondering aan te duiden
 ze kunnen de uitzondering toekennen aan een variabele zodat
hierop later kan getest worden
 voorbeeld op volgende transparant
Yolande Berbers
Programmatuur voor real-time controle
slide 26
RTP gebruik van uitzonderingen in Ada
declare
sensor_High, Sensor_Low, Sensor_Dead : exception;
-- andere declaraties
begin
-- instructies die boven-gedeclareerde uitzonderingen
-- kunnen veroorzaken
exception
when E: Sensor_High | Sensor_Low =>
-- neem een herstellende actie
-- E bevat eigenlijke uitzondering (Sensor_High of Sensor_Low)
-- waarop getest kan worden
when Sensor_Dead =>
-- luid een alarm
end;
Yolande Berbers
Programmatuur voor real-time controle
slide 27
RTP gebruik van uitzonderingen in Ada

when others : om niet alle namen te moeten opnoemen

wordt vaak gebruikt als laatste deel van exception-blok
declare
sensor_High, Sensor_Low, Sensor_Dead : exception;
begin
-- instructies die gedeclareerde uitzonderingen kunnen veroorzaken
exception
when Sensor_High | Sensor_Low =>
-- neem een herstellende actie
when E: others =>
Put (Exception_Name(E));
Put_Line (“werd veroorzaakt”)
-- luid een alarm
end;
Yolande Berbers
Programmatuur voor real-time controle
slide 28
RTP gebruik van uitzonderingen in Ada

uitzondering die veroorzaakt wordt in een handler
 kan niet behandeld worden in dat blok van handlers
 wordt automatisch direct naar oproepend blok gepropageerd
Yolande Berbers
Programmatuur voor real-time controle
slide 29
RTP



gebruik van uitzonderingen in Ada: propagatie
geen handler voorzien in een blok:
uitzondering wordt ‘naar boven’ gepropageerd
bij packages: handler in initialisatie-blok behandelen niet
de uitzonderingen van de verschillende routines
voorbeeld van package
package Temperature_Control is
subtype Temperature is Integer range 0 .. 100:
Sensor_Dead, Actuator_Dead : exception ;
procedure Set_Temperature (New_Temp : in Temperature);
function Read_Temperature return Temperature;
end Temperature_Control;
Yolande Berbers
Programmatuur voor real-time controle
slide 30
package body Temperature_Control is
procedure Set_Temperature (New_Temp : in Temperature) is
begin
-- zet de nieuwe temperatuur
if No_Response then
raise Acturator_Dead;
end if;
end Set_Temperature;
function Read_Temperature return Temperature is
begin
-- lees de sensor
if No_Response then
raise Sensor_Dead;
end if;
-- bereken de temperatuur
return Reading;
exception
when Constraint_Error => -- neem een herstellende actie
end Set_Temperature;
begin
-- initalialiseer de package
Set_Temperature(Initial_Reading);
exception
when Actuator_Dead =>
-- neem een herstellende actie
end Temperature_Control;
RTP

gebruik van uitzonderingen in Ada: laatste wensen
afhandeling van een fout:
 soms lokale oplossing tov blok waar fout gebeurde
 maar ook oplossing die afhankelijk is van oproeper van het blok


fout doorgeven naar boven: met de instructie raise
2 voorbeelden
 toekennen van hulpmiddelen

indien fout optreedt wil men hulpmiddelen weer vrijgeven

en de fout doorgeven aan oproeper
 iets veranderen aan positie flappen van vleugels van vliegtuig

indien fout: tenminste de vleugels weer symmetrisch zetten

en de fout doorgeven aan oproeper
Yolande Berbers
Programmatuur voor real-time controle
slide 32
RTP
gebruik van uitzonderingen in Ada: laatste wensen
subtype Devices is Integer range 0 .. Max;
procedure Allocate (Number : in Devices) is
begin
-- toewijzen (alloceren) van de hulpmiddelen één voor één
exception
when others =>
-- dealloceer de reeds toegewezen hulpmiddelen
raise
-- signaleer de opgetreden uitzondering aan oproeper
end Allocate;
Yolande Berbers
Programmatuur voor real-time controle
slide 33
RTP
gebruik van uitzonderingen in Ada: laatste wensen
procedure Wing_Settings (-- relevante parameters) is
begin
-- wijzig de toestand van de flappen
-- een uitzondering kan in deze code optreden
exception
when others =>
-- zorg ervoor dat de flappen weer symmetrisch staan
raise -- signaleer de opgetreden uitzondering aan oproeper
end Wing_Settings ;
Yolande Berbers
Programmatuur voor real-time controle
slide 34
RTP gebruik van uitzonderingen in Ada

uitzondering die veroorzaakt wordt tijdens declaratie
 wordt gepropageerd naar oproepend blok
 niet altijd zo gemakkelijk: speciale gevallen worden hier niet
besproken

testen op uitzondering kost tijd
 elke test door het run-time systeem vertraagt het programma

bv Constraint_Error: bij elke index in een array wordt getest
op het bereik van die index
 men kan dit onderdrukken in bepaalde delen van programma

Yolande Berbers
verantwoordelijkheid van programmeur !
Programmatuur voor real-time controle
slide 35
RTP gebruik van uitzonderingen in Ada

problemen met behandelen van uitzonderingen in Ada
 uitzonderingen en packages

uitzonderingen worden gedeclareerd in de specificatie

niet duidelijk welke routine welke uitzondering kan veroorzaken
gebruiker van package moet bij gebruik van een routine
 ofwel iets voorzien voor alle uitzonderingen (eventueel
met when others)
 ofwel in de body gaan zien wie wat signaleert
 parameters kunnen niet doorgegeven worden bij het signaleren
 handler weet eigenlijk niet veel, kan niet precies handelen
 wanneer uitzonderingen naar boven gepropageerd worden kan
de naam uit zichtbaarheid geraken
 kan dan enkel via when others opgevangen worden

Yolande Berbers
Programmatuur voor real-time controle
slide 36
RTP gebruik van uitzonderingen in Java

Java model
 expliciete declaratie van uitzonderingen
 termination model
 propagatie van onbehandelde uitzonderingen
 uitzonderingen geïntegreerd in OO model

declaratie van een uitzondering
 uitzonderingen: sub-klassen van java.lang.Throwable
 ook in taal gedefinieerde klassen
Error: hiervan zijn afgeleid klassen voor interne fouten en
uitputting van middelen (valt meestal niet veel aan te doen)
 RunTimeException: bv IndexOutOfBoundException

Yolande Berbers
Programmatuur voor real-time controle
slide 37
RTP gebruik van uitzonderingen in Java
public class IntegerConstraintError extends Exception
{ private int lowerRange, upperRange, value;
public IntegerConstraintError (int L, int U, int V)
{ super(); // call constructor on parent class
lowerRange = L;
upperRange = U;
value = V;
}
public String getMessage()
{ return (“Integer constraint error: Lower range “ +
java.lang.Integer.toString(lowerRange) + “ Upper range” +
java.lang.Integer.toString(upperRange) + “ found” +
java.lang.Integer.toString(value));
}
}
Yolande Berbers
Programmatuur voor real-time controle
slide 38
RTP gebruik van uitzonderingen in Java
public class Temperature
{ private int T;
void check (int value) throws IntegerConstraintError
{ if (value > 100 || value < 0) {
throw new IntegerConstraintError (0, 100, value); } }
public Temperature (int initial) throws IntegerConstraintError
// constructor
{ check(initial); T = initial; }
public void setValue (int V) throws IntegerConstraintError
{ check(V); T = V; }
public int readValue ()
{ return T; }
}

verschil Ada: elke operatie zegt welke uitzondering kan optreden
Yolande Berbers
Programmatuur voor real-time controle
slide 39
RTP gebruik van uitzonderingen in Java
Temperature T1;
…
try {
T1 = new Temperature(20);
…
T1.setvalue(80);
…
}
catch (IntegerConstraintError error) {
// exception caught, print error message on standard output
System.out.println(error.getMessage());
}
 handler met parameter v. type T zal een object v. type E opvangen indien
 T en E van hetzelfde type zijn
 T een superklasse van E is
Yolande Berbers
Programmatuur voor real-time controle
slide 40
RTP gebruik van uitzonderingen in Java

iets analoogs als when others in Ada
Temperature T1;
…
try {
…
…
}
catch (Exception E) {
// any exception caught, print error message on standard output
System.out.println(E.getMessage());
}
Yolande Berbers
Programmatuur voor real-time controle
slide 41
RTP


uitzonderingen en C
C biedt geen uitzonderingsmechanisme
kan enigszins nagebootst worden
 met de POSIX routines setjmp en longjmp
setjmp bewaart de programmastatus, geeft 0 terug
 longjmp herstelt de prgrammastatus
 programma voert verder uit vanaf punt waar setjmp
opgeroepen werd
 nu geeft setjmp par. van longjmp als waarde terug
 is ingewikkeld, zeer moeilijk zo maar te gebruiken (gevaar dat
er meer fouten komen dan dat er fouten opgevangen worden !!)
 kan gebruikt worden in macro’s die moeilijkheden beetje verbergen
 is niet deel v. taal => geen ondersteuning voor goed gebruik !!

Yolande Berbers
Programmatuur voor real-time controle
slide 42
Download