Johannes Zeller: Exceptions und Klassen

Beitrag lesen

Hallo Phil,

Ich habe aber auch schon gesehen, dass viele die standard Exception Klasse erweitern und damit eigene Exceptionclasses implementieren.
Ich bin mir nicht ganz sicher, wozu das gut sein soll und ab wann das Sinn macht. Kann mir das jemand erklären oder ein paar Vorteile davon nennen?

Werfen wie in deinem Beispiel bar() und baz() die gleiche Exception, kann im catch-Block nicht unterschieden werden, woher die Exception kommt. Wenn du später mal die Fehler von bar() und baz() unterschiedlich behandeln wölltest, könntest du höchstens nach getMessage() unterscheiden. Dazu müsstest du aber genau wissen, was von den beiden Funktionen dort reingeschrieben wird und dass es in jedem Fall unterschiedlich ist - in jedem Falle kein sauberer Ansatz.

Vorausgesetzt, du hast zwei abgeleitete Exception-Klassen BarException und BazException, könntest du dies ganz elegant so lösen:

  
function foo ()  
{  
    try {  
        $res  = bar();  
        $res2 = baz();  
        return $res + $res2;  
    } catch (BarException $ex) {  
        // Tue irgendetwas  
    } catch (BazException $ex) {  
        // Tue irgendetwas anderes  
    }  
}  

Ein weiterer Vorteil des expliziten Fangens einer abgeleiteten Exception-Klasse ist der Schutz vor unvorhergesehenem Programmverhalten. Angenommen eine von bar() aufgerufen Funktion (oder eine darin aufgerufene Funktion, etc.) wirft eine Exception die in bar() nicht abgefangen wird. Wenn du catch (Exception $e) in foo() verwendest, wird damit auch diese Exception abgefangen, ohne dass du merkst, dass überhaupt eine andere Exception geworfen wurde. Das kann u.a. die Fehlersuche erschweren oder dazu führen, dass Fehler nicht bemerkt werden.

Schöne Grüße,

Johannes