Aangezien error handling een belangrijk aspect is van een Architectuur en ik geen Errorhandling topic kan vinden betreffende mijn specifieke situatie, hoop ik op deze manier wat wijzer te worden.
De volgende situatie:
- Een aantal klassen waarin wordt gecommuniceerd met hardware.
- De klassen worden in een soort van 'monitor' applicatie gebruikt en ik wil dus het tonen van meldingen vermijden.
- Afgezien van het feit dat het niet nuttig een melding in een 'monitor' applicatie te tonen, wil ik ook een logging van gegenereerde fouten hebben zodat dit gebruikt kan worden in het debugging proces. (Zonder af te gaan op de bevindingen van de gebruiker.)
Met betrekking tot de errorhandling, heb ik de volgende werkwijze reeds geïmplementeerd:
- Tijdens het communiceren met de hardware worden, bij kritieke acties, custom errors opgegooid wanneer de communicatie mislukt. (Voorbeelden zijn: het niet kunnen openen van een COM poort of het niet kunnen versturen van een commando.)
- Er bestaat reeds een OnException Handler binnen mijn Delphi project, waarin het betreffende foutbericht wordt weggeschreven in een log.
Nu het volgende probleem. Wanneer ik de betreffende objecten aanroep, doe ik dat als volgt (pseudo code, slechts ten behoeve van het vormen van een beeld):
Stel dat de functie ToCompoort nu de exceptie EComException opgooid, dan wordt dit in mijn situatie netjes opgevangen door de OnError Handler en weggeschreven naar een log. Perfect. Helaas dient zich nu de volgende situatie aan. Na een raise wordt de applicatie flow gedirigeerd naar de OnException Handler en wordt na het afhandelen van de fout geen code meer uitgevoerd. In mijn geval wordt tijdens (een soortgelijke) ToCompoort functie een initialisatie scherm getoond. Na de raise wordt dit scherm dus niet meer vernietigd, omdat er geen code meer wordt uitgevoerd.
Wat wil ik nu bereiken
Feitelijk heel simpel. Ik wil dat de applicatie normaal blijft draaien, maar in het geval er een procedure wordt gestart die een exceptie opgegooid, wil ik dat juist die execptie in een log wordt weggeschreven en de applicatie verder normaal blijft functioneren. (Denk eraan dat dit een 'monitor' applicatie is, ik wil geen meldingen tonen.)
Wat ik heb geprobeerd
Door middel van het toepassen van de volgende code, kan ik voorkomen dat de werking van de applicatie wordt gegarandeerd:
Echter, nu moet ik opnieuw de functie aanroepen die naar het log schrijft, terwijl dit juist door mijn OnExceptino Handler zou uitgevoerd moeten worden. Dit resulteert weer in meer (dezelfde) code. (Er zijn namelijk meer functies die excepties opgooien en dan zou ik voor elke functie weer opnieuw de functie aan moeten roepen die naar het log schrijft.)
Hopelijk is mijn idee duildeijk. Ik vraag dus geen implementatie o.i.d. Ik zou graag wat ideëen / aanpassingen / verbeteringen hierover willen horen of wellicht reeds bestaande concepten.
De volgende situatie:
- Een aantal klassen waarin wordt gecommuniceerd met hardware.
- De klassen worden in een soort van 'monitor' applicatie gebruikt en ik wil dus het tonen van meldingen vermijden.
- Afgezien van het feit dat het niet nuttig een melding in een 'monitor' applicatie te tonen, wil ik ook een logging van gegenereerde fouten hebben zodat dit gebruikt kan worden in het debugging proces. (Zonder af te gaan op de bevindingen van de gebruiker.)
Met betrekking tot de errorhandling, heb ik de volgende werkwijze reeds geïmplementeerd:
- Tijdens het communiceren met de hardware worden, bij kritieke acties, custom errors opgegooid wanneer de communicatie mislukt. (Voorbeelden zijn: het niet kunnen openen van een COM poort of het niet kunnen versturen van een commando.)
- Er bestaat reeds een OnException Handler binnen mijn Delphi project, waarin het betreffende foutbericht wordt weggeschreven in een log.
Nu het volgende probleem. Wanneer ik de betreffende objecten aanroep, doe ik dat als volgt (pseudo code, slechts ten behoeve van het vormen van een beeld):
Delphi:
1
2
3
4
| ... connect := TConnection.Create; connect.ToCompoort( 1 ); ... |
Stel dat de functie ToCompoort nu de exceptie EComException opgooid, dan wordt dit in mijn situatie netjes opgevangen door de OnError Handler en weggeschreven naar een log. Perfect. Helaas dient zich nu de volgende situatie aan. Na een raise wordt de applicatie flow gedirigeerd naar de OnException Handler en wordt na het afhandelen van de fout geen code meer uitgevoerd. In mijn geval wordt tijdens (een soortgelijke) ToCompoort functie een initialisatie scherm getoond. Na de raise wordt dit scherm dus niet meer vernietigd, omdat er geen code meer wordt uitgevoerd.
Wat wil ik nu bereiken
Feitelijk heel simpel. Ik wil dat de applicatie normaal blijft draaien, maar in het geval er een procedure wordt gestart die een exceptie opgegooid, wil ik dat juist die execptie in een log wordt weggeschreven en de applicatie verder normaal blijft functioneren. (Denk eraan dat dit een 'monitor' applicatie is, ik wil geen meldingen tonen.)
Wat ik heb geprobeerd
Door middel van het toepassen van de volgende code, kan ik voorkomen dat de werking van de applicatie wordt gegarandeerd:
Delphi:
1
2
3
4
5
6
7
8
9
| ... try connect := TConnection.Create; connect.ToCompoort( 1 ); except on EComException do // schrijf naar log end ... |
Echter, nu moet ik opnieuw de functie aanroepen die naar het log schrijft, terwijl dit juist door mijn OnExceptino Handler zou uitgevoerd moeten worden. Dit resulteert weer in meer (dezelfde) code. (Er zijn namelijk meer functies die excepties opgooien en dan zou ik voor elke functie weer opnieuw de functie aan moeten roepen die naar het log schrijft.)
Hopelijk is mijn idee duildeijk. Ik vraag dus geen implementatie o.i.d. Ik zou graag wat ideëen / aanpassingen / verbeteringen hierover willen horen of wellicht reeds bestaande concepten.