exception handling en logging
Nog een paar vragen om het principe wat duidelijker te krijgen. Ik heb het even opgedeeld in 3 vragen met een nummer, zodat het makkelijker is om te beantwoorden.
1)
Er werd mij aangeraden om te loggen op het moment dat een exception wordt gegooid, en op het moment dat een exception wordt opgevangen. Dit was omdat er tussen het "gooien" en "vangen" iets kan gebeuren waardoor de exception niet wordt gevangen (en dus niet wordt gelogd).
Voordat je een exception gooit, log je dus eerst wat er fout gaat:
Code (php)
1
2
3
4
2
3
4
<?php
$this->logger->error('Something goes very wrong!');
throw new OhohException('ai ai ai!');
?>
$this->logger->error('Something goes very wrong!');
throw new OhohException('ai ai ai!');
?>
Nu vraag ik me toch weer af... waarom zou je net voor de throw gaan loggen? Als je zorgt dat je overal waar je een exception vangt deze exception logt, dan kan er toch niks fout gaan? Als het goed is wordt een throw altijd opgevangen door een catch blok. Als je zorgt dat er in ieder catch-blok wordt gelogd, dan is het toch niet zinvol om net vóór de throw ook nog telkens te gaan loggen? Waarschijnlijk zie ik iets over het hoofd, maar ik zie het dus even niet (meer).
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// class A
public function foo() {
if ($er_gaat_iets_verkeerd) {
$this->logger->error('Something foo goes very wrong!');
throw new OhohException('ai ai ai!');
}
}
// class B
public function bar() {
try {
$foo = new A();
$foo->foo();
} catch (AException $e) {
$this->logger->error('Something bar goes very wrong!', $e->getPrevious());
}
}
?>
// class A
public function foo() {
if ($er_gaat_iets_verkeerd) {
$this->logger->error('Something foo goes very wrong!');
throw new OhohException('ai ai ai!');
}
}
// class B
public function bar() {
try {
$foo = new A();
$foo->foo();
} catch (AException $e) {
$this->logger->error('Something bar goes very wrong!', $e->getPrevious());
}
}
?>
Zo zou het dus moeten, maar mijn vraag is dus waarom? Er wordt nu net vóór het throwen en direct na het throwen iets gelogd. Daar tussenin gebeurt niks. Waarom dan niet alleen in het catch-blok loggen. Nogmaals, er is dus vast een goede reden voor. Alleen ik zie het even niet.
2)
Is het een slim idee om in plaats van aan een logger, je exceptions aan een exception handler mee te geven? En dat je die exception handler laat loggen en mailen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
public function foo() {
try {
$this->bar->foo();
} catch (BarException $e) {
$this->exception_handler->warning('Something bar goes wrong!', $e->getPrevious());
}
}
?>
public function foo() {
try {
$this->bar->foo();
} catch (BarException $e) {
$this->exception_handler->warning('Something bar goes wrong!', $e->getPrevious());
}
}
?>
Ik geef dan aan om wat voor exception het gaat (in dit voorbeeldje om een warning), en de exception handler onderneemt dan de bijbehorende actie (bijv. door de error te loggen en een mail te sturen). Het mooie lijkt mij dat ik die exception handler dan ook andere opdrachten kan geven. Bijvoorbeeld, stel het gaat helemaal mis, dan stuur ik bijv. een fatal_error naar de exception handler. Deze logt, mailt, stuurt een sms enz. en toont vervolgens ook nog een view op het scherm "Helaas, er is een onverwachte fout opgetreden..." De exception handler kan dus meer doen dan uitsluitend loggen en heeft daarmee een wat bredere verantwoordelijkheid. Ik hoef alleen maar aan te geven om wat voor exception het gaat, de exception handler doet de rest. Wel of niet een leuk idee?
3)
Laatste vraag. Wat is in jullie ogen het nut/de bedoeling van loggen? Ik dacht dat loggen primair bedoeld is om fouten in kaart te brengen, dingen die niet goed gaan. Van een van de andere forumleden hoorde ik dat hij ook allerlei andere acties logt, bijv. het wegschrijven van een bestand, of de tijden waarop iemand inlogt enz. Nu is mijn vraag waarom je dingen die goed gaan zou willen loggen. Zolang iets goed gaat, werkt alles blijkbaar naar behoren, waarom zou je dit dan loggen? Je wil het toch alleen weten als er iets fout gaat?
Er zijn nog geen reacties op dit bericht.