2013-11-26 51 views
3

我正在運行一個腳本,它需要一個未正確包含在我的腳本中的文件。爲什麼E_WARNING的行爲像E_ERROR?

PHP Fatal error: require_once(): Failed opening required 'Math/BigInteger.php' (include_path='.:/usr/share/php:/usr/share/pear') in /myDir/Net/SSH2.php on line 746

我有一個error_handler設置,記錄每一個錯誤,我得到:

function script_error_handler($errno, $errstr, $errfile, $errline){ 
    echo "IN ERROR HANDLER\n"; 

    $GLOBALS['errors'][] = array(
     'errno'  => $errno, 
     'errstr' => $errstr, 
     'errfile' => $errfile, 
     'errline' => $errline 
    ); 

    return true; 
} 

我也有一個shutdown_function後來在錯誤去決定成敗(除其他事項外)。該功能的一部分打印我記錄的錯誤。

function shutdown_handler($io) { 
    print_r($GLOBALS['errors']); 
    echo "\n"; 
    //irrelevant stuff ommitted 
} 

奇怪的是,這樣做的輸出如下所示:

Array 
(
    [0] => Array 
     (
      [errno] => 2 
      [errstr] => require_once(Math/BigInteger.php): failed to open stream: No such file or directory 
      [errfile] => /myDir/Net/SSH2.php 
      [errline] => 746 
     ) 

) 

根據PHP的Predefined Constants2E_WARNING的值。

2 | E_WARNING (integer) | Run-time warnings (non-fatal errors). Execution of the script is not halted.

這似乎是與Fatal Error輸出我剛纔得到清晰的衝突。爲什麼我在這種情況下不能獲得E_ERROR?這裏發生了什麼?

+0

你能說明你是如何註冊處理程序的? –

+0

我可以,但我不明白這是如何相關的。當我從這兩個處理程序獲得輸出時,他們顯然正在註冊並被調用。 – MirroredFate

+0

看起來你在下面有一個答案可能不需要,所以沒有麻煩。然而,如果您發佈完整的測試用例,然後在提出問題時回答他們的問題,它可以讓人們更容易幫助您。 –

回答

3

require/require_once生成警告致命錯誤。

沒有自己的錯誤處理,你應該得到這樣的事情:

Warning: require_once(foo) [function.require-once]: failed to open stream: No such file or directory in […]

Fatal error: require_once() [function.require]: Failed opening required 'foo' (include_path='.') […]

看你輸出的errstr你看,你得到「未能打開流:沒有這樣的文件或目錄」部分 - 所以文本警告

而且description of set_error_handler告訴你,

 「The following error types cannot be handled with a user defined function: E_ERROR, […]」

因此,警告被抓的是可以預料的 - 和致命錯誤,按照什麼樣的手冊上說的,是不是。

+0

所以我應該能夠檢查'error_get_last()',如果它是一個E_ERROR,則將它添加到'shutdown_function()'中的錯誤列表中。這是一個公平的假設嗎? – MirroredFate

相關問題