Exceptions und Fehlerverarbeitung

Exceptions und Fehlerverarbeitung

am 18.04.2008 12:07:06 von Stefan+Usenet

Im Bemuehen, neben der (geplanten) Ausnahmeverarbeitung auch noch
moeglichst viele ungeplante Fehler abzufangen, will ich in einer
kritischen Funktion zusaetzlich einen Errorhandler installieren.
Sinnvoll waere es, damit die bereits vorhandenen Wege zu benuetzen, d.h.
den Fehler in eine Exception umzuwandeln. Das ganze haette in etwa die
folgende Struktur:

| function errorhandler($errno, $errstr, $errfile, $errline) {
|
| throw new Exception();
|
| }
|
| function doSomething() {
|
| set_error_handler('errorhandler');
|
| [...]
| if ($condition) throw new Exception();
| [...]
|
| restore_error_handler();
| return;
| }

Bloss, was passiert da eigentlich genau, wenn in doSomething() bzw. in
einer von dort aufgerufenen Funktion ein Fehler auftritt? Ich werde aus
dem Handbuch nicht so recht schlau, wie sich die Fehlerverarbeitung
verhaelt, wenn man _innerhalb_ davon eine Exception wirft. Ist PHP dann
(irrtuemlich) der Meinung, sich fuer den Rest des Programmlaufs in der
Fehlerverarbeitung zu befinden? Oder sollte man so ein Konstrukt
ohnedies komplett vermeiden und statt dessen anders gestalten?

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Happy mit Stefan, gelassen und schlank!
(Sloganizer)

Re: Exceptions und Fehlerverarbeitung

am 18.04.2008 14:19:06 von Christoph Herrmann

Stefan Froehlich schrieb:
> Im Bemuehen, neben der (geplanten) Ausnahmeverarbeitung auch noch
> moeglichst viele ungeplante Fehler abzufangen, will ich in einer
> kritischen Funktion zusaetzlich einen Errorhandler installieren.

Was spricht dagegen die Fehler einfach zu loggen und dann die Funktionen
anzupassen um die Fehler soweit es geht abzufangen?

> Bloss, was passiert da eigentlich genau, wenn in doSomething() bzw. in
> einer von dort aufgerufenen Funktion ein Fehler auftritt? Ich werde aus

Das Problem ist eher, dass dies wenn überhaupt nur bei Warnings und
Notice funktioniert, weil bei Errors das Skript abgebrochen wird nach
dem Ende der "doSomething()" Funktion.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/

Re: Exceptions und Fehlerverarbeitung

am 18.04.2008 14:20:57 von steffen bruentjen

Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) wrote:

>| function errorhandler($errno, $errstr, $errfile, $errline) {
>|
>| throw new Exception();
>|
>| }
>|
>| function doSomething() {
>|
>| set_error_handler('errorhandler');
>|
>| [...]
>| if ($condition) throw new Exception();
>| [...]
>|
>| restore_error_handler();
>| return;
>| }
>
>Bloss, was passiert da eigentlich genau, wenn in doSomething() bzw. in
>einer von dort aufgerufenen Funktion ein Fehler auftritt? Ich werde aus

Meinst Du nun einen Fehler oder eine Exception? Du wirfst eine
Exception, änderst vorher und nachher aber nur die Fehlerbehandlung.
In dem Fall oben würde der errorhandler nur ausgeführt werden, weil
$condition nicht definiert ist ;-)


>dem Handbuch nicht so recht schlau, wie sich die Fehlerverarbeitung
>verhaelt, wenn man _innerhalb_ davon eine Exception wirft. Ist PHP dann
>(irrtuemlich) der Meinung, sich fuer den Rest des Programmlaufs in der
>Fehlerverarbeitung zu befinden? Oder sollte man so ein Konstrukt
>ohnedies komplett vermeiden und statt dessen anders gestalten?

Ich bin mir nicht sicher, aber Du nimmst glaub ich irrtümlich an, dass
die Fehlerverarbeitung von PHP beim Setzen eines benutzerdefinierten
error_handlers an- und ausgestellt wird. Du "aktivierst" nicht die
Fehlerverarbeitung, indem Du einen eigenen error_handler definierst.
Du vermeidest nur die Ausführung des Standard-error_handlers, welcher
den Wert von error_reporting beachtet. Ob nach einem Fehler die
Ausführung fortgesetzt wird, hängt von der Art des Fehlers ab.

Eine Exception unterbricht die weitere Ausführung. In Deinem Beispiel
wird restore_error_handler() deshalb nicht ausgeführt.

Schöne Grüße, Steffen

--
Das Tastaturlayout für Programmierer:
http://eurkey.steffen.bruentjen.eu

Re: Exceptions und Fehlerverarbeitung

am 18.04.2008 14:51:47 von Stefan+Usenet

On Fri, 18 Apr 2008 14:19:06 +0200 Christoph Herrmann wrote:
> > [um] moeglichst viele ungeplante Fehler abzufangen, will ich in
> > einer kritischen Funktion zusaetzlich einen Errorhandler
> > installieren.

> Was spricht dagegen die Fehler einfach zu loggen und dann die
> Funktionen anzupassen um die Fehler soweit es geht abzufangen?

Geloggt werden sie ohnehin. Im weiteren Verlauf dieser Funktion
werden allerdings Klassen eingebunden, die zum Teil von Aussenstehenden
erstellt werden, ich kann daher nicht fuer deren Qualitaet buergen.
Am liebsten waere mir, _alle_ Fehler abfangen und auf irgendeine Art und
Weise definiert weiterarbeiten zu koennen - das laesst PHP nicht zu.
Daher ersatzweise wenigstens die Fehlercodes, wo das moeglich ist.

> Das Problem ist eher, dass dies wenn überhaupt nur bei Warnings und
> Notice funktioniert, weil bei Errors das Skript abgebrochen wird nach
> dem Ende der "doSomething()" Funktion.

Gibt es da nicht auch noch die Klasse der catchable errors, bei denen
per default abgebrochen wuerde? Das ist zugegebenermassen nur ein
schmales Segment, aber nuetzt es nichts, so schadet es auch nicht...

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Stefan - endlich ein grandioser Gedanke.
(Sloganizer)