Moin!
Nun das Ganze mit Exceptions.
try {
if (!$conn = mysql_connect(...))
throw new Exception('Verbindungsfehler');
if (!mysql_select_db('db', $conn))
throw new Exception('Select-DB-Fehler');
if (!mysql_set_charset('...', $conn)) {
throw new Exception('Set-Charset-Fehler');
$sql = "SELECT ... FROM ...";
if (!$res = mysql_query($sql, $conn))
throw new Exception('Abfragefehler');
while ($row = mysql_fetch_assoc($res)) {
...
}
mysql_close($conn);
} catch {
// Reaktion auf Fehler
// - Alternative für den Anwender
// - Meldungstext für den Admin loggen
}
>
> Hier sind immer noch eine Menge if-Anweisungen drin, was aber an PHP liegt. Die ifs übersetzen sozusagen die herkömmlich gemeldeten Fehlerzustände in Exceptions. Wäre PHP eine vollständig objektorientierte Sprache, würden die Methoden des DB-Objektes selbständig Exceptions werfen und der Code innerhalb des try sähe so aus wie eingangs der kompakte. In diesem Fall bringen Exceptions wieder etwas Übersicht in den Code.
Man kann es auch auf die kurze Formel bringen: Mit Exceptions kann man Produktivcode und Fehlerbehandlungscode voneinander trennen.
Und in der Regel wird man in einer vollständig OOP-orientierten Applikation nie diese Befehlsabfolge innerhalb einer einzigen Klasse vorfinden. Üblicherweise wird das Herstellen der DB-Connection automatisch durch instanziieren der DB-Klasse passieren (vorzugsweise "lazy"), danach steht dann eine Query-Methode zur Verfügung (deren erstmaliger Aufruf stellt die DB-Verbindung her bzw. checkt durch ein Ping, ob die Verbindung noch existiert), und das Schließen der Verbindung wird dem Script-Ende-Aufräumen überlassen.
Die einzelnen Schritte können jeweils ihren Erfolg prüfen - das ist in dem Einzelfall jeweils relativ unaufwendig. Und diese Einzelschritte können auch jeweils ihre Exception werfen.
Ein nutzendes Skript kann um den gesamten Block des DB-Abfragens ein try/catch legen und jede irgendwo geworfene Exception fangen.
Und was ist das Alternativprogramm? Mal als Beispiel: Wenn eine DB-Abfrage nur die Anzahl eingeloggter User ermitteln soll, wäre das Alternativprogramm `return 0;`{:.language-php}, denn um eine lebenswichtige Info handelt es sich eher nicht.
- Sven Rautenberg