我一直在做一些關於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");
然後致命錯誤:
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()
是有用的,但是有沒有更合適的做法呢?
你的問題還包括'Exceptions'或者'PHP Errors' – Baba
兩者,我沒有對異常做太多的評論,但我也包括它們。 – Mlagma