PHP - 通用用户友好错误消息

时间:2013-04-16 09:36:22

标签: php

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

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

当出现问题时,是否建议使用更友好的消息替换此消息?但同时,在某处的服务器上记录错误?

因此,我只希望用户知道某些内容出错,而不是显示完整的错误消息,并且会尽快更正。发生的完整错误会在后台记录,而不会向用户显示。

5 个答案:

答案 0 :(得分:3)

错误来自两个来源:

  1. 你的剧本处于你没想到的情境中。
  2. 你脚本无法控制的东西是错误的。
  3. 第一种错误来自程序中的错误,需要在那里修复。例如:

    • 在非对象上调用方法(例如,在stringint上)
    • 将错误类型的参数传递给函数(例如将bool传递给mysqli_query)。

    在开发系统上,启用display_errors没有任何问题。在生产服务器上,关闭display_errors并启用log_errors。这会将错误记录到Web服务器的日志中。通过实现自己的错误处理程序并将其注册到set_error_handler,可以实现更复杂的方法来处理错误。

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

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

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

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

答案 1 :(得分:0)

服务器上的录制可以由logging the errors完成,但我认为没有任何合理的方法可以将这些错误转换为用户友好的消息。而且应该没有办法。

您的应用程序永远不会产生任何PHP错误。如果确实如此,那么你能做(并且应该做)的唯一事情就是向用户显示一些意外出错的消息。

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

答案 2 :(得分:0)

是的,您可以使用set_error_handler来调用用户定义的功能&通过将其与trigger_error一起使用,您可以获得自定义错误消息。

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

答案 3 :(得分:0)

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

您可以使用register_shutdown_functionset_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');

答案 4 :(得分: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
}

这为您提供了很大的灵活性,当然还有嵌套尝试/捕获的可能性。

干杯