2009-10-01 102 views
0

我想在我的腳本中發生錯誤時嘗試讀取文件,這樣我就可以拋出自定義錯誤頁面。文件自定義錯誤

使用ob_start/set_error_handler時我無法在回調中使用file_get_contents或ob_start來獲取我的錯誤模板的內容。

有誰知道我可以在回調中輸出自定義模板(並使用eval)嗎?


編輯:一些代碼

error_reporting(E_ALL); 
ini_set("display_errors", 1); 

function fatal_error_handler($buffer) { 
    if (ereg("(error</b>:)(.+)(<br)", $buffer, $regs)) { 
    $ErrorString = preg_replace("/<.*?>/","",$regs[2]); 
    error_log($ErrorString); 

    $template = file_get_contents(sprintf('%s/errors/Error.php', TEMPLATES)); 
    return eval(sprintf('?>%s<?', $template); 
    //return "ERROR CAUGHT check log file"; 
    } 
    return $buffer; 
} 

function handle_error ($errno, $errstr, $errfile, $errline) 
{ 
    error_log("$errstr in $errfile on line $errline"); 
    if($errno == FATAL || $errno == ERROR){ 
     ob_end_flush(); 
     echo "ERROR CAUGHT check log file"; 
     exit(0); 
    } 
} 

ob_start("fatal_error_handler"); 
set_error_handler("handle_error"); 

以上只是顯示一個空白頁。

error_reporting(E_ALL); 
ini_set("display_errors", 1); 

function fatal_error_handler($buffer) { 
    if (ereg("(error</b>:)(.+)(<br)", $buffer, $regs)) { 
    $ErrorString = preg_replace("/<.*?>/","",$regs[2]); 
    error_log($ErrorString); 

    ob_start(); 
    include(sprintf('%s/errors/Error.php', TEMPLATES)); 
    $template = ob_get_contents(); 
    ob_end_clean(); 
    return eval(sprintf('?>%s<?', $template)); 
    //return "ERROR CAUGHT check log file"; 
    } 
    return $buffer; 
} 

function handle_error ($errno, $errstr, $errfile, $errline) 
{ 
    error_log("$errstr in $errfile on line $errline"); 
    if($errno == FATAL || $errno == ERROR){ 
     ob_end_flush(); 
     echo "ERROR CAUGHT check log file"; 
     exit(0); 
    } 
} 

ob_start("fatal_error_handler"); 
set_error_handler("handle_error"); 

和上面給出如下:

Fatal error: ob_start() [<a href='ref.outcontrol'>ref.outcontrol</a>]: Cannot use output buffering in output buffering display handlers in /var/www/index.php on line 16 
+1

代碼示例始終歡迎澄清你的意思:) – jakeisonline 2009-10-01 22:06:04

回答

2

你必須:

  • 知道,當它遇到一個錯誤file_get_contents返回false。
    • ,這意味着你可以測試它的返回值,
    • ,如果它返回false,可以顯示你的模板
  • 也小心:當有一個問題,它會產生一個錯誤,你不希望這樣一個顯示
    • 這是什麼樣的情況,而您可以使用@ operator
    • 爲「面具」的錯誤 - 你測試它是否重新轉身假的,反正

它將給那種代碼:

$result = @file_get_contents('non-existing-file'); 
if ($result === false) { 
    echo "An error has occured"; 
} 

,在我的情況下,顯示:

An error has occured 

現在,你來顯示您的錯誤模板,取決於您可能使用的框架以及所有這些;-)

+0

Pascal,感謝您的回覆...我試圖訪問的文件存在,我通過簡單地返回文件路徑而不是模板來檢查路徑。 看來file_get_contents拋出一個我看不見的錯誤,雖然我沒有看到它與文件的位置有關。 我正在將文件的完整路徑傳遞給file_get_contents,而不僅僅是實際的文件名,所以CWD問題不能出錯。 任何其他想法將非常感激! – Gavin 2009-10-02 12:30:35