Sie fragen sich, wie viel Aufwand ich betreiben sollte, um nützliche Debugging-Informationen beim Erstellen von Ausnahmemeldungen zu erzwingen, oder ob ich dem Benutzer nur vertrauen soll, dass er die richtigen Informationen bereitstellt, oder die Erfassung von Informationen an einen Ausnahmehandler verschieben soll?
Ich sehe viele Leute, die ihre Ausnahmen machen wie:
throw new RuntimeException('MyObject is not an array')
oder Erweitern der Standardausnahmen um benutzerdefinierte Ausnahmen, die nicht viel bewirken, aber den Namen der Ausnahme ändern:
throw new WrongTypeException('MyObject is not an array')
Dies liefert jedoch nicht viele Debugging-Informationen ... und erzwingt keinerlei Formatierung mit der Fehlermeldung. Es könnte also zu genau demselben Fehler kommen, der zwei verschiedene Fehlermeldungen hervorruft ... z. B. "Datenbankverbindung fehlgeschlagen" vs "Verbindung zu Datenbank konnte nicht hergestellt werden"
Sicher, wenn es nach oben sprudelt, wird die Stapelverfolgung gedruckt, was nützlich ist, aber es sagt mir nicht immer alles, was ich wissen muss, und normalerweise muss ich anfangen, var_dump () -Anweisungen abzuschießen, um sie zu entdecken Was ist schief gelaufen und wo ... obwohl dies mit einem anständigen Ausnahmebehandler etwas ausgeglichen werden könnte.
Ich fange an, über so etwas wie den Code unten zu denken, wo ich erfordern den Werfer der Ausnahme notwendig args zuzuführen , um die richtige Fehlermeldung zu erzeugen. Ich denke, dies könnte der richtige Weg sein:
- Es muss ein Mindestmaß an nützlichen Informationen angegeben werden
- Erzeugt etwas konsistente Fehlermeldungen
- Vorlagen für Ausnahmemeldungen an einem Ort (Ausnahmeklassen), damit die Nachrichten einfacher aktualisiert werden können ...
Aber ich sehe den Nachteil darin, dass sie schwieriger zu verwenden sind (erfordert, dass Sie die Ausnahmedefinition nachschlagen) und daher andere Programmierer davon abhalten können, mitgelieferte Ausnahmen zu verwenden ...
Ich möchte einen Kommentar zu dieser Idee und zu Best Practices für ein konsistentes, flexibles Framework für Ausnahmemeldungen.
/**
* @package MyExceptions
* MyWrongTypeException occurs when an object or
* datastructure is of the incorrect datatype.
* Program defensively!
* @param $objectName string name of object, eg "\$myObject"
* @param $object object object of the wrong type
* @param $expect string expected type of object eg 'integer'
* @param $message any additional human readable info.
* @param $code error code.
* @return Informative exception error message.
* @author secoif
*/
class MyWrongTypeException extends RuntimeException {
public function __construct($objectName, $object, $expected, $message = '', $code = 0) {
$receivedType = gettype($object)
$message = "Wrong Type: $objectName. Expected $expected, received $receivedType";
debug_dump($message, $object);
return parent::__construct($message, $code);
}
}
....
/**
* If we are in debug mode, append the var_dump of $object to $message
*/
function debug_dump(&$message, &$object) {
if (App::get_mode() == 'debug') {
ob_start();
var_dump($object);
$message = $message . "Debug Info: " . ob_get_clean();
}
}
Dann verwendet wie:
// Hypothetical, supposed to return an array of user objects
$users = get_users(); // but instead returns the string 'bad'
// Ideally the $users model object would provide a validate() but for the sake
// of the example
if (is_array($users)) {
throw new MyWrongTypeException('$users', $users, 'array')
// returns
//"Wrong Type: $users. Expected array, received string
}
und wir könnten so etwas wie ein nl2br in einem benutzerdefinierten Ausnahmebehandler tun, um die Dinge für die HTML-Ausgabe schön zu machen.
Gelesen: http://msdn.microsoft.com/en-us/library/cc511859.aspx#
Und so etwas wird nicht erwähnt, also ist es vielleicht eine schlechte Idee ...
RuntimeException::__construct()