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