Kleiner PHP 5.3 Gotcha in Zusammenhang mit Exceptions
Gehen wir von folgendem PHP 5.3 Codesnippet aus:
namespace Foo\Bar;
class MyClass {
...
public function test() {
try {
$this->irgendeine_methode_die_eine_exception_wirft();
}
catch(Exception $e) {
}
}
...
}
In dem Code Beispiel sollen alle Exceptions welche die Methode irgendeine_methode_die_eine_exception_wirft() werfen kann abgefangen werden. Und da alle Exceptions von der Klasse Exception ableiten, sollte es doch so funktionieren.
Was ist daran falsch (mal ganz abgesehen davon, dass man nur spezifische Exceptions abfangen sollte und wenn man Exceptions abfängt, dann sollte man mit diesen auch was sinnvolles machen, wie z. B. loggen)?
Die Exception wird nicht abgefangen, es gibt einen Fatal Error.
So ists richtig, sofern man tatsächlich alle Exceptions abfangen möchte (man bermerke den\ Backslash vor dem Klassennamen):
...
catch(\Exception $e) {
...
Ansonsten wird der Klassenname Exception relativ zum aktuellen namespace aufgelöst, d. h. im ersten Codebeispiel wird nur eine Exception der Klasse Foo\Bar\Exception abgefangen. Was auch wünschenswert sein könnte. Aber möglicherweise nicht Intention des Autors war (ja, war ein Bock den ich geschossen hab, deswegen schreib ichs auf, damit ichs nicht nochmal mach
).
Eigentlich ziemlich logisch, wenn man sichs genau überlegt.