PHP错误处理和异常处理?

时间:2012-09-23 19:04:59

标签: php exception-handling error-handling

我一直在研究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");

代码在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()可以解决问题,但有没有更合适的方法呢?

3 个答案:

答案 0 :(得分:1)

  

我的问题是这些示例是否通常被认为适合处理生产环境中的错误,或者是否有任何明显不正确或缺乏的错误。

是的。您只需要确保捕获所有生成的异常。 我还想记住你,如果你的脚中存在一个synthax错误,或者你的服务器配置错误,那么php可能会输出因为编译错误而无法处理的错误。

  

在任何情况下,这些函数是附加到所有文件还是设置在类中?

一旦您注册了它们(使用set_error_handler),它们将应用于脚本中调用的每个文件,除非您的某个文件重新提供处理程序。

并停止脚本,退出是好方法

答案 1 :(得分:0)

有一些方法可以将所有错误作为例外处理,这很好,我已经在一两个项目上完成了这些工作,我对结果感到满意。

但是要注意这一点,即使是警告和通知也会致命(因为例外情况是致命的,如果没有赶上)。 此外,语法错误不会作为异常处理,因为它们不是运行时错误,而是编译时(意味着您的脚本从未编译,并且没有运行任何代码行)。

答案 2 :(得分:0)

  

我的问题是这些例子是否通常被认为适合处理生产环境中的错误,或者是否有任何公然不正确或缺乏。

PHP Errors是的..他们很好你只需要更好的存储空间来解决你的错误,特别是如果你正在使用多台服务器

Exceptions我认为这还不够......他们需要根据类型进行处理,例如数据库,网络等。