Ich bin nicht in der Lage zu entscheiden, wie Ausnahmen in meiner Anwendung behandelt werden sollen.
Viel, wenn meine Probleme mit Ausnahmen darin bestehen, 1) über einen Remote-Dienst auf Daten zuzugreifen oder 2) ein JSON-Objekt zu deserialisieren. Leider kann ich für keine dieser Aufgaben einen Erfolg garantieren (Netzwerkverbindung trennen, fehlerhaftes JSON-Objekt, das außerhalb meiner Kontrolle liegt).
Wenn ich auf eine Ausnahme stoße, fange ich sie einfach in der Funktion ab und gebe FALSE an den Aufrufer zurück. Meine Logik ist, dass der Anrufer sich nur darum kümmert, ob die Aufgabe erfolgreich war und nicht, warum sie nicht erfolgreich war.
Hier ist ein Beispielcode (in JAVA) einer typischen Methode.
public boolean doSomething(Object p_somthingToDoOn)
{
boolean result = false;
try{
// if dirty object then clean
doactualStuffOnObject(p_jsonObject);
//assume success (no exception thrown)
result = true;
}
catch(Exception Ex)
{
//don't care about exceptions
Ex.printStackTrace();
}
return result;
}
Ich denke, dieser Ansatz ist in Ordnung, aber ich bin wirklich neugierig, welche Best Practices für die Verwaltung von Ausnahmen gelten (sollte ich eine Ausnahme wirklich bis zum Ende eines Aufrufstapels sprudeln lassen?).
Zusammenfassend zu den wichtigsten Fragen:
- Ist es in Ordnung, Ausnahmen nur abzufangen, aber nicht in die Luft zu sprudeln oder das System offiziell zu benachrichtigen (entweder über ein Protokoll oder eine Benachrichtigung an den Benutzer)?
- Welche Best Practices gibt es für Ausnahmen, die nicht dazu führen, dass alles einen Try / Catch-Block erfordert?
Follow Up / Edit
Vielen Dank für das Feedback und einige hervorragende Quellen zum Online-Ausnahmemanagement:
- Best Practices für die Ausnahmebehandlung | O'Reilly Media
- Best Practices für die Ausnahmebehandlung in .NET
- Best Practices: Ausnahmemanagement (Artikel verweist jetzt auf die Kopie von archive.org)
- Antipatterns zur Ausnahmebehandlung
Es scheint, dass das Ausnahmemanagement eines der Dinge ist, die je nach Kontext variieren. Vor allem aber sollte man konsistent sein, wie Ausnahmen innerhalb eines Systems verwaltet werden.
Achten Sie außerdem auf Code-Rot durch übermäßiges Ausprobieren oder Nicht-Respektieren einer Ausnahme (eine Ausnahme warnt das System, was muss noch gewarnt werden?).
Dies ist auch ein ziemlich guter Kommentar von m3rLinEz .
Ich stimme Anders Hejlsberg und Ihnen eher zu, dass es den meisten Anrufern nur wichtig ist, ob die Operation erfolgreich ist oder nicht.
Aus diesem Kommentar ergeben sich einige Fragen, über die beim Umgang mit Ausnahmen nachgedacht werden muss:
- Was ist der Punkt, an dem diese Ausnahme ausgelöst wird?
- Wie macht es Sinn, damit umzugehen?
- Interessiert sich der Anrufer wirklich für die Ausnahme oder interessiert es ihn nur, ob der Anruf erfolgreich war?
- Ist es sinnvoll, einen Anrufer zu zwingen, eine potenzielle Ausnahme zu verwalten?
- Sind Sie respektvoll gegenüber den Redewendungen der Sprache?
- Müssen Sie wirklich ein Erfolgsflag wie boolean zurückgeben? Die Rückgabe von Booleschen Werten (oder Int) ist eher eine C-Denkweise als eine Java-Denkweise (in Java würden Sie nur die Ausnahme behandeln).
- Befolgen Sie die mit der Sprache verknüpften Fehlerverwaltungskonstrukte :)!