Tach!
Ich persönlich mag das nicht, dass die Fehlermeldung aus einem anderem Objekt kommt, in der ein DB-Query stattfindet.
Das einzige Standardverhalten in einem Fehlerfall wäre das Logging für den Administrator, und auch das ist nicht bei jedem Fehler notwendig. Alle weiteren Fehler müssen individuell beim Aufrufenden behandelt werden. Die Datenbank-Klasse weiß nicht, ob zum Beispiel ein mit einer Unique-Constraint-Verletzung beendetes Insert ein Fehler ist oder vom Aufrufer so beabsichtigt war. Deren Aufgabe ist nur, den Fehler an den Aufrufer zu melden. Der weiß besser, wie er darauf reagieren soll. Insofern wirft die Datenbankklasse lediglich eine Exception und fertig ist ihre Fehlerbehandlung. Die aufrufende Stelle hingegen fängt sie ab und reagiert für ihren Anwendungsfall angemessen - oder delegiert die Behandlung weiter nach oben, indem sie die Exception neu wirft, sie dazu vielleicht umpackt oder sie einfach ungefangen nach oben durchlässt. Das muss man jeweils individuell entscheiden.
Damit wäre prinzipiell auch diese Frage geklärt:
Sehe ich vollkommen auch so! Jede Klasse sollte möglichst ohne den Einfluss anderer Klassen arbeiten. Könntest du mir bitte an einem Code-Beispiel zeigen, wie du bspw. eine fehlgeschlagene Verbindung aus einem DB-Objekt an ein ErrorHandling-Objekt senden würdest, damit dies die passende Aktion durchführt.
Wirf eine Exception.
Dazu aber eine Warnung. Exceptions sind kein Allheilmittel. Wenn beispielsweise ein Teilstring in einem String nicht gefunden wird, kann das eine Ausnahme sein, muss aber nicht. In der Regel wird man das durch ein entsprechendes Funktionsergebnis (false statt Position) und nicht mit einer Exception signalisieren. Auch für das Beispiel von oben lässt sich sicher streiten, ob das nun eine Ausnahme war oder ob man dieses beabsichtigte Auflaufen auf diesen Fehler vielleicht der Datenbank-Klasse als normales Verhalten beibringt. Der Hintergrund für die beabsichtigte Unique-Constraint-Verletzung ist, ein TOCTTOU-Problem zu vermeiden. Wenn man sicherstellen möchte, dass ein Name (vielleicht ein Login) nur einmal auftritt, legt man besser einen Unique-Index auf das Feld und lässt Inserts ohne weitere Prüfung in diese Tabelle laufen. Bei Dopplungen gibt es den erwähnten Fehler, ansonsten läuft das Insert rein. Vorher das DBMS zu befragen, ob ein solcher Name bereits vorhanden ist, ist ungünstig, denn zwischen der Abfrage und dem Eintragen könnte sich jemand anderes drängeln. Nicht immer also ist ein Fehler auch eine Ausnahme.
dedlfix.