2009-05-29 8 views
15

PHP mkdir Funktion gibt nur wahr und falsch zurück. Problem ist, wenn es falsch zurückgibt.Wie findet man einen Grund, wenn mkdir aus PHP ausfällt?

Wenn ich mit Fehlerberichterstattung aktiviert bin, sehe ich die Fehlermeldung auf dem Bildschirm. Ich kann die Fehlermeldung auch im Apache Protokoll sehen. Aber ich würde gerne den Text der Nachricht erfassen und etwas anderes damit machen (z. B. mir über IM senden). Wie bekomme ich den Fehlertext?

Update: Nach Ayman Idee kam ich zu diesem:

function error_handler($errno, $errstr) { 
    global $last_error; 
    $last_error = $errstr; 
} 

set_error_handler('error_handler'); 
if (!mkdir('/somedir')) 
    echo "MKDIR failed, reason: $last_error\n"; 
restore_error_handler(); 

aber ich mag es nicht, weil es globale Variable verwendet. Irgendeine Idee für eine sauberere Lösung?

+0

Soulmerge Antwort ist eine bessere Wahl weil es Sie über den Fehler informiert, ohne den Handler zu ersetzen. –

+4

Beachten Sie, dass Fehlerhandler auf einem Stapel in PHP gespeichert sind, was bedeutet, dass der Aufruf von restore_error_handler() den vorherigen Fehlerhandler wiederherstellen wird, unabhängig davon, ob es sich um den integrierten Handler oder einen anderen benutzerdefinierten Handler handelt. Es gibt also keinen Verlust, wenn der Error-Handler vorübergehend durch set_error_handler() ersetzt wird. – soulmerge

Antwort

42

Sie können suppress the warning und die Verwendung von error_get_last() machen:

if ([email protected]($dir)) { 
    $error = error_get_last(); 
    echo $error['message']; 
} 
+5

+1, aber es ist erwähnenswert, dass dies möglicherweise fragil ist, wenn ein weiterer Fehler zwischen mkdir() und error_get_last() auftritt, was passieren kann, wenn Ihr Code komplexer wird (als extremes, unrealistisches Beispiel könnte eine Tick-Funktion laufen und erzeuge einen Fehler vor deinem error_get_last() -Aufruf). Dies ist jedes Mal ein Risiko, wenn Sie irgendeine Art von "get-last-error" -Funktion verwenden. –

14

Sie könnten Ausnahmen verwenden:

-Setup einige Code wie folgt:

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

Und dann tun nur:

try { 
    mkdir('/somedir'); 
} catch(ErrorException $ex) { 
    echo "Error: " . $ex->getMessage(); 
} 

Das sollte tun, was Sie wollen.

Wenn Sie den PHP-Fehler-Handler erhalten wollen, dann nach dem Try-Catch-Block, rufen Sie einfach:

restore_error_handler() 
+0

+1 Ich mag diesen Ansatz, ich habe es nicht getestet, aber es fühlt sich solide an. Auch sieht es mehr oo-freundlich aus;) –

+2

Auch PHP's OO-Bibliotheken beschäftigen sich mit all diesen Sachen viel besser http://www.php.net/manual/en/class.splfileobject.php –

+1

@nickfox mkdir wirft keine Ausnahme , das ist der Grund für den benutzerdefinierten Fehlerhandler, der eine Ausnahme auslöst. Was die OO-Bibliotheken von PHP betrifft, tun sie das wahrscheinlich besser. – Kazar

3

ich so etwas wie die folgenden verwenden:

if(! @mkdir('$fileLocation', 0777, $recursive = true)){ 
    $mkdirErrorArray = error_get_last(); 
    throw new Exception('cant create directory ' .$mkdirErrorArray['message'], 1); 
} 
Verwandte Themen