Run-time errors opvangen
Stel je wil dat een bepaalde run-time fout in je code niet als een foutmelding wordt weergegeven op je scherm. Hoe doe je dat dan?
Even voor de duidelijkheid: er zijn twee soorten
foutmeldingen
a) foutmelding van de debugger, deze krijg je alleen te zien als je in Delphi
aan het programmeren bent. De eindgebruiker ziet dit dus niet.

b) foutmelding van het programma dat je aan het maken bent, zie je altijd als je het programma uitvoert en de fout wordt gemaakt. Deze fout melding ziet de gebruiker dus wel en de programmeur soms.

1. Met try ... except. Dat werkt zoals je verwacht en uitgelegd staat in de help file. Als er een excepetion ontstaat gaat de control* naar wat er bij except staat en als de juiste exception erbij staat (je kunt ook alle excepetions laten afvangen) voert de control uit wat er bij do staat. Er is echter een maar: de exception word wel aangeroepen, en de Delphi Debugger geeft dan wel een foutmelding! Dus: je vangt de foutmelding van het programma zelf wel af maar de foutmelding van de debugger niet! De eindgebruiker ziet de foutmelding dus niet, de programmeur wel. V.b.**:
var
F: textfile;
Mystring: string;
begin
try
AssignFile(F, ''); // De overduidelijke fout
Read (F, Mystring);
except
//on EInouterror do ShowMessage('Fout bij in of uitvoer');
on EInouterror do Abort; //in de EXECUTABLE
wordt de exception volledig stil afgehandeld
end;
end;
2. Met een compiler directive {$I-}. Oude pascal stijl. Je kunt gewoon de Input/Output foutmeldingen uitschakelen. Je kunt IOResult functie gebruiken om te zien of er tijdens het uitzetten een excpetion is geweest, als er eentje is geweest krijgt deze nummer v/d foutmelding, anders een nul. Jammer genoeg ken ik dit alleen maar bij I\O fouten. V.b.:
{$I-}
AssignFile(F, ''); // De overduidelijke fout
Read (F, Mystring);
{$I+}
//if IOResult <> 0 then ShowMessage('Fout bij in of uitvoer');
3. Je kunt ook ALLE exception meldingen in de Delphi debugger uitzetten. Heb je er helemaal geen last van. Probleem opgelost. Je krijgt nu dus alleen maar de foutmeldingen van het programma te zien. De setting om het altijd uit te zetten vind je in het menu bij Tools > Debugger Options > language exceptions (zie hieronder).

Jammer genoeg reageert de debugger dan bij helemaal geen enkele fout meer, terwijl het juist heel handig is om te zien waar de fout ontstond en dat je dan ook meteen watches kunt gebruiken. Je kunt met een truc ook lokaal de debugger foutmeldingen uitzetten.
4. Met ExceptionClass. Deze class bevat alle fouten waarop de debugger reageert. Dan zet je die tijdelijk op een lege class en weer op de gebruikelijke class als je weer wil dat de debugger je wel van een exception op de hoogte brengt. In het voorbeeld dat hieronder staat zet ik beide soorten fouten uit, omdat je anders de debugger niet meer opnieuw kan aanzetten.
//Vang én de executable foutmelding af én de Delphi debugger foutmelding af
//Als je alleen de debugger foutmelding afzet, worden de foutmeldingen niet
//meer aangezet, omdat na de exception de rest van de code niet meer uitgevoerd word
//Dit werkt bij vrijwel alle exceptions!
var
F: textfile;
Mystring: string;
EmptyClass : TClass;
begin
ExceptionClass := EmptyClass;//Fout meldingen afzetten
try
AssignFile(F, ''); // De overduidelijke fout
Read (F, Mystring);
except
on EInouterror do Abort;
end;
ExceptionClass := Exception; //Alle foutmeldingen weer aanzetten
end;
* Wellicht ter overvloedde de control is 'waar delphi in de code aan het uitvoeren is'.
**Het programma waar al de voorbeeld code uitkomt zit in de attachment!