我一直在做一些关于 php 错误处理和异常处理的研究。
例如,要处理用户错误,最好使用set_error_handler()
用户错误。示例代码:
// Destinations
define("ADMIN_EMAIL", "nobody@stanford.edu");
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()
有诀窍,但有什么更合适的做法吗?