Sven Rautenberg: Fehlerbehandlung, wie man sie nicht realisieren sollte

Beitrag lesen

Moin!

An deiner Klasse ist zu kritisieren, dass du die Fehlerbehandlung wirklich übertreibst - und ohnehin so formuliert hast, wie man sie nur zu Testzwecken formulieren sollte. Eine Klasse sollte NIE das Skript abbrechen, sie sollte das Vorliegen eines bösen Fehlerzustandes immer an das aufrufende Programm zurückmelden, damit dieses dann abbrechen kann - oder auch nicht.

Fangen wir mal "innen" an: Ist es denn wirklich notwendig, das erfolgreiche Zuweisen eines Wertes an eine Eigenschaft der Klasse innerhalb von setAV zu prüfen? Was passiert, wenn man als Arbeitsverzeichnis den Leerstring zuweisen will? Richtig, die Klasse bricht ab!

Wann aber kann eine Zuweisung an eine Eigenschaft der Klasse fehlschlagen? Doch eigentlich nur dann, wenn die Eigenschaft nicht existiert. Dann aber würde sich PHP (mindestens bei error_reporting(E_ALL)) ohnehin mit einer Fehlermeldung melden. Ansonsten kann bei diesem Schritt nichts schiefgehen.

Was natürlich "schiefgehen" kann im Sinne der Klasse, wäre eine falsche Verzeichnisangabe. Aber Prüfungen über die Zulässigkeit des übergebenen Parameters finden in setAV() ja nicht statt, also ist alles zulässig.

Ein Schritt weiter nach außen finden wir im Konstruktor der Klasse den Aufruf von setAV. Hier wird wieder kontrolliert, ob diese Methode erfolgreich aufgerufen werden konnte.

Wann aber kann ein Methodenaufruf fehlschlagen und KEINE PHP-Fehlermeldung nach sich ziehen? Auch an dieser Stelle ist die Fehlerbehandlung vollkommen überflüssig und kann komplett entfallen. Entweder existiert setAV(), dann kann man es auch aufrufen, oder es existiert nicht, bzw. erhält die falsche Anzahl von Parametern - dann meldet sich automatisch PHP, mindestens mit einer NOTICE, bei fatalen Fehlern wird das Skript sogar gestoppt, sofern nicht sogar Parsingfehler den Start komplett verhindern.

Die einzige Methode, die komplexere Funktionen ausführen muß, ist lies_in_string() - aber dort fehlt es komplett an Fehlerbehandlungsmethoden.

Beispiele: War chdir() erfolgreich? War fopen() erfolgreich? War fread() erfolgreich? War fclose() erfolgreich?

Und wie wäre es stattdessen damit, einfach Verzeichnisname und Dateiname zu einem Pfad zusammenzubasteln und dann file_get_contents() aufzurufen?

<?php

function lies_in_string($datei) {
      $av = getcwd();
      chdir($this->arbeitsverzeichnis);
      $fp = fopen($datei, "r");
      $fc = fread($fp, filesize($datei));
      fclose($fp);
      chdir($av);
      return $fc;
   }
?>

  
Mit genauso wenig Fehlerbehandlung, wie oben, wäre dieser Code von der Funktion her annähernd identisch:  
  
~~~php
  
function lies_in_string($datei) {  
  return file_get_contents($this->arbeitsverzeichnis."/".$datei);  
}  

- Sven Rautenberg

--
My sssignature, my preciousssss!