Programmeren in PL/1/Foutenafhandeling
PL/1 voorziet foutafhandeling (error handling, recovery).
Soorten fouten
bewerken- OVERFLOW exponent-overflow
- UNDERFLOW exponent-underflow
- FIXEDOVERFLOW fixed-point-overflow
- SIZE fixed-point-overflow
- ZERODIVIDE deling door nul
- SUBSCRIPTRANGE indexbereik
- STRINGRANGE substringbereik
- STRINGSIZE stringlengte
- ENDFILE einde van het bestand
- ENDPAGE einde van de pagina
- ATTENTION oproep via het klavier
De gebruiker kan het systeem fouten laten rapporteren en een vooraf gekozen actie uitvoeren door middel van ON. Het opvangen van de fout wordt maar actief na het uitvoeren van de ON-lijn.
PL/1-code: ON OVERFLOW
... ON OVERFLOW SNAP GO TO einde; a = b * c; ... einde: ...
In bovenstaand voorbeeld zal, indien b maal c de maximale toegelaten waarde voor a overschrijdt, gesprongen worden naar de lijn met het label 'einde'.
SNAP zorgt voor het afdrukken van een foutenbericht samen met de plaats waar de fout opgetreden is.
SUBSCRIPTRANGE
bewerkenPL/1-code: SUBSCRIPTRANGE
(SUBSCRIPTRANGE): a: PROC; DCL x(10) FLOAT; DCL (i, k) FIXED BIN; ON SUBSCRIPTRANGE SNAP BEGIN; PUT SKIP LIST ('Onbestaand element op positie '); PUT DATA (i); STOP; END; GET LIST(k); DO i = 1 to k; x(i) = 0; END; END a;
Als in bovenstaand voorbeeld een waarde hoger dan 10 opgegeven wordt, zal de DO-loop ervoor zorgen dat i uiteindelijk de waarde 11 krijgt, waardoor het onbestaande element x(11) uit de array x() zal aangesproken worden.
EOF/EOP
bewerkenON ENDFILE en ON ENDPAGE zijn gebeurtenissen die geen echte fouten zijn, maar die wel moeten opgevangen worden met een gepaste actie zoals het stoppen van het lezen van het bestand of het afdrukken van een nieuw paginahoofd.
PL/1-code: ON ENDPAGE - ON ENDFILE
ON ENDPAGE PUT PAGE LIST('Bladzijde', paginanummer); ON ENDFILE(bestand1) go to volgende;
zelf-opgeroepen gebeurtenissen
bewerkenEen programmeur kan zelf een fout uitlokken:
PL/1-code: SIGNAL
IF (deeltal = 0) THEN SIGNAL ZERODIVIDE;
zelf-gedefinieerde gebeurtenissen
bewerkenPL/1-code: ON ...
ON kookt GO TO kooktijd; IF (temperatuur >= 100) THEN SIGNAL kookt;