4

目前,我的 PHP 页面上有以下内容:

error_reporting( E_ALL | E_STRICT );
ini_set('display_errors', 1);

当出现问题时,是否有推荐的方法用更用户友好的消息替换它?但同时,在某处记录服务器上的错误?

因此,我不想显示完整的错误消息,而是希望用户知道出了问题,并且会尽快纠正。发生的完整错误被记录在后台而不向用户显示。

4

5 回答 5

3

错误来自两个来源:

  1. 您的脚本处于您没有预料到的情况。
  2. 你的脚本无法控制的东西是错误的。

第一种错误来自程序中的错误,需要在那里修复。例子是:

  • 在非对象上调用方法(例如在 astring或 an上int
  • 将错误类型的参数传递给函数(例如将 a 传递boolmysqli_query)。

display_errors在开发系统上,打开并没有错。在生产服务器上,关闭display_errors然后再打开log_errors。这会将错误记录到您的 Web 服务器的日志中。通过实现自己的错误处理程序并将其注册到set_error_handler.

第二种错误超出了您的脚本的控制范围,因此您的脚本必须准备好优雅地处理它们。例子是:

  • 数据库系统已关闭。
  • 您尝试访问的文件不存在。

要处理这些错误,请阅读您使用的每个函数和方法的文档,确定调用何时会失败并采取相应措施。例外情况可能会对您有所帮助。

不恰当地处理第二种错误通常会导致第一种错误。例如,如果您不检查是否mysqli_connect实际建立了数据库连接(第二种错误),则以下调用mysqli_query将产生第一种错误。

于 2013-04-16T09:43:47.123 回答
0

我建议您将所有 php 错误/警告/通知转换为异常并像处理任何异常一样处理异常。这在 php 中是可能的,并且使错误处理比默认方式更优雅:

set_error_handler( function( $num, $msg, $file, $line ) {
  # take into account the '@' operators ( or remove this line and ignore them ):
  if ( error_reporting() === 0 ) return false;
  throw new \ErrorException( $msg, $num, 0, $file, $line );
});
// stolen from my blog @ http://codehackit.blogspot.be/2012/01/php-errorswarningsnotices-to-exceptions.html

然后你可以将你的整个索引/控制器方法包装成一个 try catch:

try {
  # request handler.. 
} catch ( ErrorException $e ) {
  # tell the user something went wrong and save $e->getMessage() into a custom log file
}

这给了你很大的灵活性,当然还有嵌套 try/catch 的可能性。

干杯

于 2013-04-16T10:00:48.407 回答
0

在服务器上记录可以通过记录错误来完成,但我认为没有任何明智的方法可以将这些错误转换为用户友好的消息。而且不应该有办法。

您的应用程序不应产生任何 PHP 错误。如果是这样,您唯一可以(并且应该)做的就是向用户显示出现意外错误的消息。

用户友好的错误消息是您自己创建的消息,通过抛出某些异常或其他形式的错误处理。

于 2013-04-16T09:40:06.517 回答
0

是的,您可以使用set_error_handler来调用用户定义的函数,并且通过将它与trigger_error一起使用,您可以获得自定义错误消息。

检查示例 #1在set_error_handler页面上使用 set_error_handler() 和 trigger_error() 处理错误。

于 2013-04-16T09:47:58.993 回答
0

不幸的是,您无法捕获编译时错误,因此 PHP 错误处理功能无法捕获代码中的任何语法错误。

您可以使用register_shutdown_function,set_error_handlerset_exception_handler来自定义错误行为。

我用它来制作更加用户友好的错误消息,并让用户可以选择发送带有他的操作描述的错误报告等。

例子:

function myExceptionHandler($e){
    //Debug data to display to the user in error.php.
    $_SESSION['error_dump'] = print_r($e,true);
    header('Location: error.php');
}
set_exception_handler('myExceptionHandler');
于 2013-04-16T09:48:39.817 回答