2009-05-29 40 views
15

PHP的mkdir函數只返回true和false。問題是它何時返回false。如何找到mkdir從PHP失敗的原因?

如果我在啓用錯誤報告的情況下運行,我會在屏幕上看到錯誤消息。我也可以在Apache日誌中看到錯誤消息。但是我想抓取信息的文本,並用它做一些其他的事情(例如通過IM發送給我自己)。我如何獲取錯誤文本?

更新:繼艾曼的想法,我來到了這一點:

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(); 

不過,我並不因爲它使用全局變量喜歡它。任何想法更清潔的解決方案?

+0

Soulmerge的回答是一個更好的選擇因爲它會告訴你有關錯誤而無需更換處理程序。 – 2009-05-30 10:30:54

+4

請注意,錯誤處理程序存儲在PHP的堆棧中,這意味着對restore_error_handler()的調用將恢復以前的錯誤處理程序,無論是內置處理程序還是其他自定義處理程序。所以暫時用set_error_handler()替換錯誤處理程序是沒有任何損失的。 – soulmerge 2009-05-30 11:35:09

回答

42

可以suppress the warning和利用error_get_last()

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

+1,但值得注意的是,如果mkdir()和error_get_last()之間發生另一個錯誤,這可能會很脆弱,當代碼變得更加複雜時(這是一個極端的,不切實際的示例,tick函數可能會運行並且在你的error_get_last()調用之前產生一個錯誤)。無論何時使用任何類型的get-last-error函數,這都是一種風險。 – 2010-01-07 22:01:12

14

您可以使用例外:

設置一些代碼,像這樣:

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

然後就去做:

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

這應該做你想做的。

如果您想保留PHP的錯誤處理程序,那麼該try catch塊後,只要致電:

restore_error_handler() 
3

我使用類似以下內容:

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