Heizer: Fehlerbehandlung, brauche Idee

Liebes Forum

In einem meiner scripte laufen alle Anfragen an das Dateisystem über eine Funktion, die die codierung von Sonderzeichen übernimmt. Das sieht folgendermaßen aus:

function fs() {
 $vars = func_get_args();
 $func = array_shift($vars);
 $vars = myencode($vars);
 $ret = call_user_func_array($func,$vars))
 $ret = mydecode($ret);
 return $ret;
}

myencode() ist dabei die Funktion, die das codieren macht, aber das ist gar nicht das Problem.

Mein Problem besteht darin, daß ich keine Möglichkeit finde, Fehlermeldungen von call_user_func_array() abzufangen. Wenn also eine so aufgerufende Funktion einen Fehler zurückgibt, so kann ich das nicht überprüfen.

Nehmen wir an, ich habe die funktion is_dir().
Dann sieht mein Aufruf so aus: fs("is_dir",$path)

Wenn nun call_user_func_array("is_dir",$path) einen Fehler verursacht (z.B. weil der angegebene Pfad nicht existiert), so hätte ich gerne eine Anzeige, wo in welcher Datei fs() aufgerufen wurde. Also das was seit PHP 5 debug_print_backtrace() macht.

Ich finde aber keine Möglichkeit, herauszufinden, ob call_user_func_array() einen Fehler verursacht hat, oder nicht.

Normalerweise würde ich das so machen:

if (!$ret = call_user_func_array($func,$vars))
  trigger_error(debug_print_backtrace(),E_USER_ERROR);

Nur leider kann $ret alle möglichen Werte zu recht haben, ohne das es einen Fehler bedeuteten würde. Wenn also im obrigen Beispiel $path einfach kein Verzeichnis ist, dann wird FALSE zurückgegeben und die Fehlermeldung erzeugt.

Hoffe, jemand hat eine Lösung für dieses Problem.

Grüße

Heizer

  1. hallo,

    Mein Problem besteht darin, daß ich keine Möglichkeit finde, Fehlermeldungen von call_user_func_array() abzufangen. Wenn also eine so aufgerufende Funktion einen Fehler zurückgibt, so kann ich das nicht überprüfen.

    die frage ist, ob deine funktion eine exception auslöst, oder einen für dich unerwarteten wert zurück gibt.

    Wenn nun call_user_func_array("is_dir",$path) einen Fehler verursacht

    das tut sie nicht, sondern sie gibt false zurück. du musst also dein $ret auf (in dem fall) true prüfen. wenn das nicht der fall ist, löst du mit throw eine Exception aus. Die ausgelöste Exception enthält standardmässig die debug_backtrace ausgabe.

    Nur leider kann $ret alle möglichen Werte zu recht haben, ohne das es einen Fehler bedeuteten würde. Wenn also im obrigen Beispiel $path einfach kein Verzeichnis ist, dann wird FALSE zurückgegeben und die Fehlermeldung erzeugt.

    hier hast du anscheinend einen konzeptionellen fehler, wenn $ret alles sein kann. dann schreib dir eben eine funktion, die nur im falschen fall false zurückgibt. dann brauchst du zwar auch kein call_user_func_array mehr, aber so kommst du wohl nicht weiter. wie gesagt, bei deinem beispiel wird kein fehler ausgelösst.

    andreas