2013-04-16 75 views
4

由于那一刻,我有以下我的PHP页面:PHP - 通用用户友好的错误消息

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

有出问题的时候有更多的用户友好的消息替换这一个推荐的方法?但是同时,在服务器上记录错误?

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

+0

基本上你不显示错误的客户端,但如果你坚持,你可以尝试[下](http://stackoverflow.com/a/14787080/) – HamZa

+0

我想你不得不为用户使用'try catch'块 – asprin

+0

“用户友好”这些消息不适合用户 - 他们是为你。 – AD7six

回答

3

错误有两个来源:

  1. 你的脚本是在你没有预料到sitiuation。
  2. 你的脚本控制之外的东西是错误的。

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

  • 调用非对象上的方法(例如,在stringint
  • 传递错误的类型的参数的函数(像传递到boolmysqli_query)。

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

错误的第二种不在脚本的控制范围之内,因此脚本必须准备妥善处理它们。示例如下:

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

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

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

0

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

您的应用程序不应该产生任何PHP错误。如果确实如此,那么您可以(也应该)做的唯一一件事情就是向用户提供一条消息,指出事件意外出错。

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

+0

听起来好像我没有正确地说明自己。这基本上就是我想要展示的东西,也就是一条消息,只是说出乎意料地出了什么问题。有推荐的方法吗? – oshirowanen

0

是的,您可以使用set_error_handler调用用户定义的函数&与trigger_error一起使用,您可以获得自定义错误消息。

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

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'); 
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 { 
    # request handler.. 
} catch (ErrorException $e) { 
    # tell the user something went wrong and save $e->getMessage() into a custom log file 
} 

这给了你很多的灵活性和嵌套尝试/捕获的可能性当然。

干杯

+0

您的尝试捕捉示例捕获所有可能的错误? – oshirowanen

+0

使用这个技巧,如果你确保首先在它自己的文件中执行set_error_handler,然后只包括下一步(例如在bootstrap.php/init.php文件中),你甚至可以将致命的语法错误作为例外;)是的,这会将所有的php错误/通知/警告转换为异常。即使是致命的。 – smassey

相关问题