2012-09-23 199 views
1

我一直在做一些關於php錯誤處理和異常處理的研究。PHP錯誤處理和異常處理?

例如,要處理用戶錯誤,最好使用set_error_handler()來解決用戶錯誤。示例代碼:

// Destinations 
define("ADMIN_EMAIL", "[email protected]"); 
define("LOG_FILE", "/my/home/errors.log"); 

// Destination types 
define("DEST_EMAIL", "1"); 
define("DEST_LOGFILE", "3"); 

/** 
* my_error_handler($errno, $errstr, $errfile, $errline) 
* 
* Author(s): thanosb, ddonahue 
* Date: May 11, 2008 
* 
* custom error handler 
* 
* Parameters: 
* $errno: Error level 
* $errstr: Error message 
* $errfile: File in which the error was raised 
* $errline: Line at which the error occurred 
*/ 

function my_error_handler($errno, $errstr, $errfile, $errline) 
{ 
switch ($errno) { 
case E_USER_ERROR: 
    // Send an e-mail to the administrator 
    error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_EMAIL, ADMIN_EMAIL); 

    // Write the error to our log file 
    error_log("Error: $errstr \n Fatal error on line $errline in file $errfile \n", DEST_LOGFILE, LOG_FILE); 
    break; 

case E_USER_WARNING: 
    // Write the error to our log file 
    error_log("Warning: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE); 
    break; 

case E_USER_NOTICE: 
    // Write the error to our log file 
    error_log("Notice: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE); 
    break; 

default: 
    // Write the error to our log file 
    error_log("Unknown error [#$errno]: $errstr \n in $errfile on line $errline \n", DEST_LOGFILE, LOG_FILE); 
    break; 
} 

// Don't execute PHP's internal error handler 
return TRUE; 
} 


// Use set_error_handler() to tell PHP to use our method 
$old_error_handler = set_error_handler("my_error_handler"); 

代碼在http://www.stanford.edu/dept/its/communications/webservices/wiki/index.php/How_to_perform_error_handling_in_PHP發現。

然後致命錯誤:

register_shutdown_function('handleShutdown'); 

function handleShutdown() { 
    $error = error_get_last(); 
    if($error !== NULL){ 
     $info = "[SHUTDOWN] file:".$error['file']." | ln:".$error['line']." | msg:".$error['message'] .PHP_EOL; 
     yourPrintOrMailFunction($info); 
    } 
    else{ 
     yourPrintOrMailFunction("SHUTDOWN"); 
    } 
} 

代碼發現在How do I catch a PHP Fatal Error

從我所知道的情況看,這基本上涵蓋了腳本中可能發生的所有錯誤(作爲一個非常一般的說法 - 很難預測所有錯誤)。在開發一個課堂時,思想看來,似乎建議在內部使用例外來處理它們。

我的問題是這些例子通常被認爲是否適合在生產設置中處理錯誤,或者如果有什麼是明顯不正確或缺乏的。

在任何情況下,這些函數是附加到所有文件中還是設置在類中?

任何幫助表示讚賞。

編輯:我也打算加入,如果遇到某個錯誤,我將如何停止腳本。很顯然,exit()die()是有用的,但是有沒有更合適的做法呢?

+0

你的問題還包括'Exceptions'或者'PHP Errors' – Baba

+0

兩者,我沒有對異常做太多的評論,但我也包括它們。 – Mlagma

回答

1

我的問題是這些例子通常被認爲是否適合在生產設置中處理錯誤,或者如果有什麼明顯不正確或缺乏。

是的。你只需要確定你捕獲了所有生成的異常。 我也想記住你,如果你的腳本中有一個synthax錯誤,或者如果你的服務器配置錯誤,php可能會輸出錯誤,因爲它們是編譯時錯誤而不能處理。

在任何情況下,這些函數是附加到所有文件中還是設置在類中?

一旦你註冊他們(帶的set_error_han dler)它們應用到每一個被稱爲在離開,如果你的文件的一個redifine處理程序腳本文件。

,並停止腳本,退出是好辦法

+0

非常好,我相信示例錯誤處理在交換機中有一個默認值,可以捕獲意外的錯誤。並添加一個默認的異常處理程序將很容易。 – Mlagma

0

有來處理所有錯誤,異常的辦法,這很好,我已經在一個或兩個項目這樣做,我很滿意結果。

但是請注意,即使警告和通知將會變成致命的(因爲如果不趕上異常是致命的)。 此外,語法錯誤不會作爲例外處理,因爲它們不是運行時錯誤,而是編譯時(意味着您的腳本永遠不會編譯,並且不會運行代碼行)。

0

我的問題是這些例子通常被認爲是否適合在生產設置中處理錯誤,或者如果有什麼明顯不正確或缺乏。

PHP Errors是..他們是很好的,你只需要爲你的錯誤,更好的存儲,特別是如果您正在使用多臺服務器

Exceptions我不認爲這是足夠的......他們需要處理的工作取決於類型,例如數據庫,網絡等。