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