Over het omgaan met uitzonderingen in Delphi Exception Handling

click fraud protection

Hier is een interessant feit: nee code is foutloos - in feite zit sommige code expres vol met "fouten".

Wat is een fout in een applicatie? Een fout is een onjuist gecodeerde oplossing voor een probleem. Dat zijn logische fouten dat kan leiden tot verkeerde functieresultaten waarbij alles mooi bij elkaar lijkt maar het resultaat van de applicatie volledig onbruikbaar is. Met logische fouten, een toepassing kan al dan niet stoppen met werken.

Uitzonderingen kunnen fouten in uw code zijn waarbij u getallen door nul probeert te verdelen, of u probeert vrijgemaakte geheugenblokken te gebruiken of probeert verkeerde parameters aan een functie te geven. Een uitzondering in een applicatie is echter niet altijd een fout.

Uitzonderingen en de uitzonderingsklasse

Uitzonderingen zijn speciale voorwaarden die speciale behandeling vereisen. Als er een fouttype optreedt, roept het programma een uitzondering op.

U (als toepassingsschrijver) handelt uitzonderingen af ​​om uw toepassing meer foutgevoelig te maken en te reageren op de uitzonderlijke toestand.

instagram viewer

In de meeste gevallen zult u merken dat u de toepassingsschrijver bent en ook de bibliotheekschrijver. U moet dus weten hoe u uitzonderingen (uit uw bibliotheek) kunt aankaarten en hoe u hiermee om moet gaan (vanuit uw toepassing).

Het artikel over omgaan met fouten en uitzonderingen biedt enkele basisrichtlijnen voor het beschermen tegen fouten met try / except / end en try / eindelijk / end beveiligde blokken om te reageren op of om te gaan met uitzonderlijke omstandigheden.

Een simpele poging / behalve het bewaken van blokken ziet er als volgt uit:


proberen
ThisFunctionMightRaiseAnException ();
behalve// verwerk hier alle uitzonderingen die in ThisFunctionMightRaiseAnException () worden opgeworpen
einde;

De ThisFunctionMightRaiseAnException kan bij de implementatie ervan een coderegel hebben


verhogen Uitzondering. Creëren ('bijzondere staat!');

De uitzondering is een speciale klasse (een van de weinige zonder een T voor de naam) gedefinieerd in de eenheid sysutils.pas. De SysUtils-eenheid definieert verschillende afstammelingen voor speciale doeleinden (en creëert dus een hiërarchie van uitzonderingsklassen) zoals ERangeError, EDivByZero, EIntOverflow, etc.

In de meeste gevallen zijn de uitzonderingen die u zou behandelen in het beschermde try / except-blok niet van de uitzondering (basis) klasse, maar van een speciale klasse Uitzondering-afstammelingen gedefinieerd in de VCL of in de bibliotheek die u bent gebruik makend van.

Uitzonderingen afhandelen met Try / Except

Om een ​​uitzonderingstype op te vangen en af ​​te handelen, zou u een "on type_of_exception do" exception-handler construeren. De "bij uitzondering doen" lijkt veel op de klassieke case-instructie:


proberen
ThisFunctionMightRaiseAnException;
behalve EZeroDivide dobegin// iets bij delen door nuleinde;
Aan EIntOverflow dobegin// iets bij een te grote berekening van gehele getalleneinde;
anders beginnen// iets wanneer andere uitzonderingen worden opgeworpeneinde;
einde;

Merk op dat het else-gedeelte alle (andere) uitzonderingen zou bevatten, inclusief degene waarvan u niets weet. Over het algemeen moet uw code alleen uitzonderingen afhandelen waarvan u echt weet hoe u ermee moet omgaan en waarvan u verwacht dat deze wordt gegooid.

U mag ook nooit een uitzondering "eten":


proberen
ThisFunctionMightRaiseAnException;
behalve
einde;

Het eten van de uitzondering betekent dat u niet weet hoe u met de uitzondering moet omgaan of dat u niet wilt dat gebruikers de uitzondering of iets daartussenin zien.

Wanneer u de uitzondering afhandelt en u er meer gegevens van nodig heeft (het is tenslotte een instantie van een klasse) in plaats van alleen het type uitzondering dat u kunt doen:


proberen
ThisFunctionMightRaiseAnException;
behalve E: Uitzondering dobegin
ShowMessage (E.Message);
einde;
einde;

De "E" in "E: Exception" is een tijdelijke uitzonderingsvariabele van het type gespecificeerd na het kolomteken (in het bovenstaande voorbeeld de basisklasse Exception). Met E kunt u waarden voor het uitzonderingsobject lezen (of schrijven), zoals de eigenschap Message ophalen of instellen.

Wie maakt de uitzondering vrij?

Is het je opgevallen hoe uitzonderingen eigenlijk gevallen zijn van een klasse die afdaalt van Uitzondering? Het zoekwoord raise genereert een instantie van een uitzonderingsklasse. Wat u maakt (de uitzonderingsinstantie is een object), doet u ook moeten vrijmaken. Als u (als bibliotheekschrijver) een exemplaar maakt, zal de toepassingsgebruiker het dan vrijmaken?

Hier is de Delphi magie: het behandelen van een uitzondering vernietigt automatisch het uitzonderingsobject. Dit betekent dat wanneer u de code in het blok "behalve / einde" schrijft, het uitzonderingsgeheugen wordt vrijgegeven.

Dus wat gebeurt er als ThisFunctionMightRaiseAnException daadwerkelijk een uitzondering oproept en u deze niet afhandelt (dit is niet hetzelfde als "eten")?

Hoe zit het als nummer / 0 niet wordt afgehandeld?

Wanneer een niet-verwerkte uitzondering in uw code wordt gegooid, behandelt Delphi opnieuw op magische wijze uw uitzondering door het foutdialoogvenster aan de gebruiker weer te geven. In de meeste gevallen biedt dit dialoogvenster niet genoeg gegevens voor de gebruiker (en tot slot u) om de oorzaak van de uitzondering te begrijpen.

Dit wordt gecontroleerd door Delphi's berichtlus waar allemaal uitzonderingen worden verwerkt door het globale Application-object en de HandleException-methode.

Om uitzonderingen wereldwijd af te handelen en uw eigen meer gebruiksvriendelijke dialoog te tonen, kunt u code schrijven voor TApplicationEvents. OnException event handler.

Merk op dat het globale Application-object is gedefinieerd in de Forms-eenheid. De TApplicationEvents is een component die u kunt gebruiken om de gebeurtenissen van het globale Application-object te onderscheppen.

instagram story viewer