PHP错误处理和异常处理?

PHP错误处理和异常处理?,php,exception-handling,error-handling,Php,Exception Handling,Error Handling,我一直在研究php错误处理和异常处理 例如,要处理用户错误,最好对用户错误使用set\u error\u 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"

我一直在研究php错误处理和异常处理

例如,要处理用户错误,最好对用户错误使用
set\u error\u 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");
    }
}
代码位于

据我所知,这似乎基本上涵盖了脚本中可能发生的所有错误(作为一个非常笼统的说法,很难预测所有错误)。在开发类时,Think认为,似乎建议使用异常在内部处理它们

我的问题是,这些示例是否通常被认为适合处理生产环境中的错误,或者是否存在明显的错误或缺失

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

感谢您的帮助

编辑:我还想补充一点,如果遇到某个错误,如何停止脚本。显然,
exit()
die()
起到了作用,但是还有更合适的方法吗

我的问题是,这些示例是否通常被认为适合处理生产环境中的错误,或者是否存在明显的错误或缺失

是的。您只需确保捕获所有生成的异常。 我还想提醒您,如果脚本中存在synthax错误,或者服务器配置不正确,php可能会输出无法处理的错误,因为它们是编译时错误

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

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

要停止脚本,退出是一个好方法

我的问题是,这些示例是否通常被认为适合处理生产环境中的错误,或者是否存在明显的错误或缺失

是的。您只需确保捕获所有生成的异常。 我还想提醒您,如果脚本中存在synthax错误,或者服务器配置不正确,php可能会输出无法处理的错误,因为它们是编译时错误

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

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


要停止脚本,退出是一个好方法

有一些方法可以将所有错误作为异常处理,这很好,我已经在一两个项目上这样做了,我对结果感到满意

但是请注意,即使是警告和通知也会变得致命(因为异常如果不被发现,也是致命的)。
另外,语法错误不会作为异常处理,因为它们不是运行时错误,而是编译时错误(这意味着您的脚本从未编译过,也没有运行过代码行)。

有一些方法可以将所有错误作为异常处理,这很好,我已经在一两个项目中这样做了,并且我对结果感到满意

但是请注意,即使是警告和通知也会变得致命(因为异常如果不被发现,也是致命的)。 此外,语法错误不会作为异常处理,因为它们不是运行时错误,而是编译时错误(这意味着您的脚本从未编译,也没有运行任何代码行)

我的问题是,这些示例是否通常被认为适合处理生产环境中的错误,或者是否存在明显的错误或缺失

PHP错误
Yes。。它们很好,您只需要更好的错误存储,特别是在使用多台服务器时

例外情况
我认为这还不够。。。它们需要根据数据库、网络等类型进行处理

我的问题是,这些示例是否通常被认为适合处理生产环境中的错误,或者是否存在明显的错误或缺失

PHP错误
Yes。。它们很好,您只需要更好的错误存储,特别是在使用多台服务器时


例外情况
我认为这还不够。。。它们需要根据数据库、网络等类型进行处理。

您的问题是否也包括
异常
或只是
PHP错误
两者,我对异常没有太多评论,但我也包括它们。您的问题是否也包括
异常
或只是
PHP错误
两者,我对异常没有太多的评论,但我也包括了它们。非常好,我相信示例错误处理在捕获意外错误的开关中有一个默认值。添加一个默认的异常处理程序将非常简单。非常好,我相信示例错误处理在捕获意外错误的开关中有一个默认值。添加一个默认的异常处理程序将非常简单。