PHP ErrorHandler Ideen

Aradiv

Well-known member
ID: 217591
L
20 April 2006
1.683
176
Hi ich möchte alle Fehler mit einem eigenen ErrorHandler abfangen. So lange ich da immer nur eine "Standardfehlermeldung" Anzeige ist das auch kein Problem. Im Testmodus möchte ich aber genauere Fehlerbeschreibungen ausgeben Lassen.
Zu diesem Zweck habe ich eigene Exceptions mit einigen eigenen Daten

als Beispiel mysqlException hier wird zusätzlich noch das zu Grunde liegende Query gespeichert die erzeugte Resource und fals vorhanden die mysql Fehlermeldung.

Im Detail sieht das in der Datenbankklasse dann wie folgt aus
PHP:
throw new MysqlException("An error ocured on execution of your query", self::$__query, self::$__resource, mysql_error());
Über set_error_handler kann ich problemlos alle Fehler abfangen nur mein Problem ist
wie unterscheide ich welche Art von Exception jetzt aufgetreten ist ohne ein try catch für jede Exception zu schreiben.

Aradiv
 
Zuletzt bearbeitet:
instanceof? Nur ne Idee, hab ich noch nie probiert.
 
instanceof funktioniert wunderbar, habe ich rege im Einsatz.

PHP:
echo $e->message;
if ($e instanceof MysqlException){
  echo $e->query;
}

Alternativ geht auch:
PHP:
echo $e->message;
if (get_class($e) == 'MysqlException'){
  echo $e->query;
}
 
Und wenn du einfach den Klassennamen ausgeben willst: get_class()

EDIT: Ah. Zu spät. Das kommt davon wenn man vergisst den Post abzusenden und das erst später bemerkt.


Wobei ich eigentlich gerade sehe, dass das alles ein wenig komisch ist wie ihr das macht/vorhabt: Wozu gibt es die Methode Exception::__toString() oder Exception::getMessage()?
Somit kann man dann bei jeder Klasse diese Methode überschreiben und muss nicht bei jeder Fehlerausgabe unterscheiden welche Klasse man hat!? Sonst muss man ja für jede Klasse da was hinzufügen.. wäre ja richtig schei*e 8)

Und joschilein: get_class() zeigt immer den "wahren" Klassennamen an, mit instanceof werden auch die Eltern überprüft wenn ich es richtig im Kopf habe:

PHP:
class A {

}

class B extends A {

}

$a = new A();
$b = new B();

// alles ungetestet
var_dump($a instanceof A); // true
var_dump($b instanceof B); // true
var_dump($b instanceof A); // true

echo get_class($a); // A
echo get_class($b); // B
 
Zuletzt bearbeitet:
Wobei ich eigentlich gerade sehe, dass das alles ein wenig komisch ist wie ihr das macht/vorhabt: Wozu gibt es die Methode Exception::__toString() oder Exception::getMessage()?
Somit kann man dann bei jeder Klasse diese Methode überschreiben und muss nicht bei jeder Fehlerausgabe unterscheiden welche Klasse man hat!? Sonst muss man ja für jede Klasse da was hinzufügen.. wäre ja richtig schei*e 8)
Also meine Exception Klassen haben eigene Methoden für eine ordentlich strukturierte und farbige Debug-Ausgabe (worauf auch __tostring() geschaltet ist), bei der db-Variante natürlich auch mit Query etc. Aber das ist natürlich alles Geschmackssache. Ich nutze die verschiedenen Exception-Klassen nicht zur unterschiedlichen Ausgabesteuerung, sondern zur einfachen gezielten catch-Behandlung. So schmeiße ich die db-Exceptions meist bis oben durch, um nicht ewig mit fehlerhaften Querys zu arbeiten, die ich sonst vielleicht gar nicht bemerkt hätte.

Und übrigens motzt mich mein exception_handler an, wenn er eine Exception zur Verarbeitung bekommt, ich sie also nicht irgendwo gefangen und behandelt habe. Das hat mir auch schon mal geholfen.


Und joschilein: get_class() zeigt immer den "wahren" Klassennamen an, mit instanceof werden auch die Eltern überprüft wenn ich es richtig im Kopf habe:
Jupp. Da meine Exception-Klassen (bzw. generell alle Klassen) aber überschaubar sind (keine Arbeitsklasse vererbt an eine andere, sie haben höchstens gemeinsame Eltern), habe ich die Unterscheidung bisher nicht wirklich benötigt.