2011-12-22 16 views
4

我需要捕捉功能「包含」PHP的最後一個錯誤。如何捕獲函數「include」中的錯誤PHP?

我使用函數「Exceptions」進行測試,但不幸的是,我在上面寫了函數「include」。

如果我在寫入函數「include」之後沒有顯示異常。

實施例1:

try{ 
     throw new exception(); 
     require_once($this->controller['path']); 
    } 
    catch(exception $e) 
    { 
     print_r(error_get_last()); 
    } 

此返回值: ...(無效)...

實施例2:

try{ 

     require_once($this->controller['path']) OR throw new exception();; 
    } 
    catch(exception $e) 
    { 
     print_r(error_get_last()); 
    } 

此返回:解析錯誤:語法錯誤,意外的T_THROW在...

我故意在要包含的文件中創建了一個語法錯誤。這個想法是捕獲錯誤,以便您可以調試它們。

任何人有任何想法如何得到這個?

夥計!我需要捕捉語法錯誤。問候!

+0

夥計們!我需要捕捉語法錯誤。 問候! – 2011-12-22 05:20:35

+2

@OlaErlandsenTriskel:你不能。語法錯誤在令牌化級別失敗。那時你的代碼還沒有開始執行。您可以包含該文件並在單個文件上運行'token_get_all()'。不知道如果有一個解析錯誤會發生什麼(可能是一個空數組)? – alex 2011-12-22 05:23:35

+0

你爲什麼要測試語法錯誤?你必須在開發時做到這一點,而不是在運行時 – 2011-12-22 05:29:20

回答

6

首先,如果您使用require,如果文件無法包含,它總是會殺死您的應用程序。無法控制結果,事後你無法做任何事情。如果您想控制文件包含的成功,請使用include並測試其返回值。

$success = include "foo.php"; 
if (!$success) { 
    // the file could not be included, oh noes! 
} 

你可以有像語法差異:

if (!(include "foo.php")) ... 

觸發E_NOTICE如果文件不能被包含,你不能趕上。但沒關係,因爲它可以幫助您調試問題,並且無論如何會在生產中關閉錯誤顯示(右側,右側?)。

or throw new Exception不起作用,因爲throw是一個語句,不能在需要表達式的地方使用。


如果你想趕上在語法錯誤包括文件,使用php_check_syntax /它的繼任者php -l <file>

+0

這不包括與「語法錯誤」包括:S – 2011-12-22 05:58:15

+0

你確定語法錯誤不在包含的文件?!這可能是你的問題嗎? – deceze 2011-12-22 05:59:47

+0

我特意在要包含的文件中創建了一個語法錯誤。這個想法是捕獲錯誤,以便您可以調試它們。 – 2011-12-22 06:04:19

4

require_once是一種語言結構,而不是一個功能,你不能做它短路。

要在包含它之前測試文件是否存在,可以使用is_file()。如果要測試該文件是否可讀,則可以使用is_readable()

如果找不到文件,您可能還想使用include發出E_WARNING,而不是E_COMPILE_ERROR

+0

他不想測試文件是否存在,我相信,但是如果該文件是*可讀的* – 2011-12-22 05:05:41

+0

@ Col.Shrapnel:更新了答案,謝謝。 – alex 2011-12-22 05:06:18

+0

大聲笑,它變得有點滑稽。包括*表示讀取,所以它變成了「爲了測試文件是否可讀,你可以使用is_file()。如果你想測試文件是否可讀,你可以使用is_readable()。」 :) – 2011-12-22 05:12:12

1

我與亞歷克斯同意,嘗試與檢查導管錯誤file_exists()然後使用異常

if(file_exists($this->controller['path'])){ 
    try{ 
     require_once($this->controller['path']); 
    }catch(Exception $e){ 
      // throw error 
    } 
} 

或使用is_readable()

if(is_readable($this->controller['path'])){ 
    try{ 
     require_once($this->controller['path']); 
    }catch(Exception $e){ 
      // throw error 
    } 
} 
0

大多數PHP函數引發錯誤,而不是拋出異常。爲了PHP錯誤轉化爲例外,您可以設置自定義錯誤處理程序:

function exceptions_error_handler($severity, $message, $filename, $lineno) { 
    throw new ErrorException($message, 0, $severity, $filename, $lineno); 
} 
set_error_handler('exceptions_error_handler'); 

有了這個代碼,你就可以捕獲所有非致命錯誤例外。請注意,require_*函數會引發致命錯誤,因此您必須改用include

至於處理代碼本身的語法錯誤,如果你仔細想一想,這是完全不可能的。

+0

我用過它,但是我從一個類調用函數「include」... – 2011-12-22 05:31:47

+2

那麼是什麼?它可以在任何地方使用 – 2011-12-22 05:47:53