Kennisbank

Exception handling in Delphi

Introductie

Delphi wordt geleverd met een uitstekende debugger. Voor normaal ontwikkelwerk kun je volstaan met de geïntegreerde debugger. Maar soms heb je extra informatie nodig om een exceptie op te sporen. Gelukkig biedt het Delphi-ecosysteem veel tools om functionaliteit aan Delphi toe te voegen. In dit artikel bekijken we vier externe tools voor het afhandelen van excepties.

De tools

Voor deze analyse hebben we de volgende tools geselecteerd:

Alleen de Jedi-bibliotheek is gratis als je deze tools wilt gebruiken in commerciële toepassingen. Je kunt MadExcept ook gebruiken voor niet-commerciële projecten. MemInsight, MadExcept en Eurekalog zitten allemaal in dezelfde prijsklasse, tussen € 115,- en € 149,- per gebruiker.

Functionaliteit

Een goede tool helpt je als ontwikkelaar om bugs sneller te vinden en op te lossen. Een goede stack trace is hiervoor essentieel. Een stack trace is een overzicht van calls in de volgorde waarin ze plaatsvonden tot het punt waarop je programma een exceptie tegenkwam. Elk item in deze stack trace heeft informatie zoals de naam van de procedure of functie, de locatie in de broncode en het regelnummer. Dit maakt het heel gemakkelijk om de exacte plaats te vinden waar een exceptie optreedt.

Laten we eens kijken naar de beschikbare tools.

TMS MemInsight

TMS MemInsight is een relatief nieuwe tool, gelanceerd in 2022. Het is een tool om je te helpen bij het bekijken van de run-time geheugentoewijzing, exception call stack en thread inspectie.

MemInsight bestaat uit één component: TTMSMemInsightProfiler. Je kunt dit component op elk formulier of gegevensmodule plaatsen. Het belangrijkste verschil met de andere tools in dit overzicht is dat MemInsight een direct runtime overzicht geeft van de statistieken, excepties en geheugenstatus van je applicatie, niet pas nadat een exception is opgetreden. Dit maakt het een handige tool tijdens de ontwikkeling.

Het is niet mogelijk om de stack traces automatisch naar een bug tracker of webservices te sturen, waardoor het vooral geschikt is voor jou als ontwikkelaar en minder voor productiesystemen.

MadExcept

In tegenstelling tot MemInsight heeft MadExcept geen visuele componenten die je op een formulier of datamodule moet plaatsen. In plaats daarvan kun je MadExcept per project activeren.

MadExcept vangt excepties op nadat ze in je applicatie zijn opgetreden. Je kunt MadExcept gebruiken om eventuele access violations of excepties te verbergen, de stack trace door te sturen naar ftp, mail of webservice, of een formulier weergeven waarmee gebruikers kunnen kiezen of ze het rapport willen voortzetten, versturen of het bugrapport willen opslaan. Daarnaast kunnen uitgebreide logbestanden of bugrapporten worden opgeslagen en bekeken met een aparte viewer. Het is niet mogelijk om een runtime overzicht te krijgen van geheugengebruik of excepties die eerder zijn opgetreden, zoals met MemInsight.

Eurekalog

Eurekalog richt zich ook op het gebruiksvriendelijker maken van foutmeldingen of excepties die kunnen optreden in je applicatie. Hoewel er geen gratis, niet-commerciële versie beschikbaar is, is de prijs vergelijkbaar met MadExcept. MadExcept en Eurekalog lijken qua functionaliteit ook erg op elkaar. Eurekalog heeft echter uitgebreidere mogelijkheden om stack traces en logbestanden naar bug trackers zoals Mantis, Jira of GitHub te sturen.

Eurekalog heeft uitgebreidere opties dan MadExcept, hoewel de twee producten op de kerncomponenten vergelijkbaar zijn. Op details, zoals lokalisatie, heeft Eurekalog meer te bieden. Aan de andere kant geeft MadExcept voor grotere projecten minder overhead en is het sneller te compileren.

Jedi Debug

Je kunt Jedi Debug, of jclDebug, installeren via de GetIt pakketbeheerder of via een handmatige installatie via https://www.delphi-jedi.org/

jclDebug heeft niet, zoals MadExcept of Eurekalog, een handige installer of een gemakkelijke manier om de afhandeling van excepties te configureren. In plaats daarvan moet je de debug handler handmatig aanmaken en configureren, bijvoorbeeld in het initialisatie- en afsluitgedeelte van je applicatie.

Omdat jclDebug tot het open-source project Jedi behoort, is jclDebug gratis te gebruiken. Je offert hier echter wel wat functionaliteit op, zoals het eenvoudig configureren van opties en het automatisch doorsturen van bugrapporten inclusief stack trace. Als je volledige flexibiliteit wilt in het afhandelen van excepties, is jclDebug zeker het overwegen waard.

 

Andere tools

Er zijn andere (open source) tools op de markt, waaronder DebugEngine. Helaas is DebugEngine niet up-to-date en wordt het niet meer actief onderhouden. Dit maakt het riskant om te gebruiken in productiesystemen. Daarnaast heeft FastMM5 bijvoorbeeld alleen ondersteuning voor JCL, madExcept en EurekaLog, dus persoonlijk zou ik een van deze drie gebruiken voor (productie) exception handling.

Tot slot zijn er tools die zich meer richten op het detecteren van geheugenlekken, zoals Delphi LeakCheck en FastMM. Deze tools hebben geen ondersteuning voor het afhandelen van excepties, waardoor ze buiten de scope van dit artikel vallen.

Conclusie

Welke tool je kiest, hangt af van je doel met deze tools. Als je als ontwikkelaar direct inzicht wilt tijdens het ontwikkelen van je applicatie, dan is TMS Meminsight erg handig. Met een enkel component en zonder al te veel configuratie kun je direct inzicht krijgen in statistieken, geheugengebruik en stack traces voor excepties.

Als je exception handling wilt gebruiken in productiesystemen, dan kun je eigenlijk niet om MadExcept en Eurekalog heen. Beide producten hebben een lange en bewezen geschiedenis, zijn stabiel en bieden veel functionaliteit. De keuze tussen MadExcept en Eurekalog is persoonlijk, beide producten zijn een zeer waardevolle uitbreiding om beter inzicht te krijgen in eventuele runtime problemen.

En als je geen geld wilt uitgeven aan deze tools, is er een gratis en open-source alternatief jclDebug, hoewel je dan wel veel functionaliteit zelf moet bouwen.

Zoals je ziet is er voor elke situatie een oplossing, wat maar weer aantoont dat het ecosysteem rond Delphi zeer waardevol is voor jou als ontwikkelaar.

 

Geschreven door Marco Geuze
Directeur

Contact

Laat ons helpen jouw ambities concreet te maken.