Fehler-handling in Funkionen?

therealcharlie

Erfahrenes Mitglied
Also mein Problem sieht folgendermaßen aus:
Ich arbeite mit verschiedenen Funktionen in meiner Anwendung. Ein davon ist z.B.
PHP:
function textload($file)	{
$fp = @fopen("$file.pcn","r"); // Datei öffnen
	if ($fp)
	{
		while(!feof($fp))//Solange bis der Dateizeiger am Ende der Datei ist
		{
			$zeile = fgets($fp,100);//Einlesen der Zeilen
			$output = $zeile;//Ausgabe
		}
		fclose($fp); // Datei schließen
	}
	else
	{
		ERROR-HANDLER// Sollte Datei nicht vorhanden sein
	}
	return $output;
}

Funktioniert alles, ist das schön und gut. Tritt aber ein Fehler auf, gehen wir also in den else-Zweig, möchte ich, dass der aufgetretene Fehler in einer anderen variable ($error) gespeichert wird. Da ich aber nur eine variable zurückgeben kann, bzw nur in eine variable den rückgabewert schreiben kann, funktioniert das nicht. hat irgendjemand eine idee dazu?
 
Du musst einen Parameter als Referenz übergeben. In dem kannst Du dann die Fehlermeldungen eintragen. Du kannst weiterhin einen aussagefähigen Rückgabewert übergeben.
Im folgenden Beispiel einer Division gebe ich im Fehlerfall false zurück. Der Rückgabewert wird typsicher geprüft. Alternativ lässt sich mit [phpf]count[/phpf] auch die Größe des Fehlerarrays prüfen und so abfrgagen, ob ein Fehler vorligt. Nun aber zum Beispiel:
PHP:
<?
    function division($dividend,$divisor,&$error=array()) {
        $internErrors=array();
        if ($divisor===0 || $divisor===0.0) {
            $internErrors[]="Der Divisor muss != 0 sein.";
        }
        if ($divisor===null || $dividend===null) {
            $internErrors[]="Einer der Parameter ist null.";
        }
        if (!(is_int($dividend)||is_float($dividend))) {
            $internErrors[]="Der Divident muss eine Zahl sein.";
        }
        if (!(is_int($divisor)||is_float($divisor))) {
            $internErrors[]="Der Divisor muss eine Zahl sein.";
        }
        if (count($internErrors)>0) {
            $error = array_merge($error,$internErrors);
            return false;
        } else {
            return $dividend / $divisor;
        }
    }

    /********************************/
    /* Ende des Beispiels,          */
    /* Es folgen Testaufrufe        */
    /********************************/

    //Ohne Fehlerbehandlung:
    $quotient = division(10,0);
    var_dump($quotient);
    echo "<br>\n";

    $quotient = division(21,3);
    var_dump($quotient);
    echo "<br>\n";

    $quotient = division(0,53);
    var_dump($quotient);
    echo "<br>\n";

    //Mit Fehlerbehandlung:
    $errors=array();
    $quotient = division(10,0,$errors);
    if ($quotient===false) {
        var_dump($errors);
    } else {
        var_dump($quotient);
    }

    echo "<br>\n";
    $errors=array();
    $quotient = division(21,3,$errors);
    if ($quotient===false) {
        var_dump($errors);
    } else {
        var_dump($quotient);
    }
    echo "<br>\n";

    $errors=array();
    $quotient = division(0,53,$errors);
    if ($quotient===false) {
        var_dump($errors);
    } else {
        var_dump($quotient);
    }
    echo "<br>\n";

    $errors=array();
    $quotient = division("Hallo",53,$errors);
    if ($quotient===false) {
        var_dump($errors);
    } else {
        var_dump($quotient);
    }
    echo "<br>\n";

    $errors=array();
    $quotient = division(null,53,$errors);
    if ($quotient===false) {
        var_dump($errors);
    } else {
        var_dump($quotient);
    }
    echo "<br>\n";

    $errors=array();
    $quotient = division(null,null,$errors);
    if ($quotient===false) {
        var_dump($errors);
    } else {
        var_dump($quotient);
    }

?>
Gruß hpvw
 
Zuletzt bearbeitet:
Zurück