由于那一刻,我有以下我的PHP页面:PHP - 通用用户友好的错误消息
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
有出问题的时候有更多的用户友好的消息替换这一个推荐的方法?但是同时,在服务器上记录错误?
因此,我不想显示完整的错误消息,而只是想让用户知道出现了问题,并且会尽快进行纠正。发生的完整错误在后台记录而不显示给用户。
由于那一刻,我有以下我的PHP页面:PHP - 通用用户友好的错误消息
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
有出问题的时候有更多的用户友好的消息替换这一个推荐的方法?但是同时,在服务器上记录错误?
因此,我不想显示完整的错误消息,而只是想让用户知道出现了问题,并且会尽快进行纠正。发生的完整错误在后台记录而不显示给用户。
错误有两个来源:
错误的第一种来自程序中的错误,需要在那里修复。实例是:
string
或int
)bool
mysqli_query
)。在开发系统上,开启display_errors
没有任何问题。在生产服务器上,关闭display_errors
并打开log_errors
。这会将错误记录到Web服务器的日志中。通过实现您自己的错误处理程序并使用set_error_handler
进行注册,可以实现更复杂的错误处理方法。
错误的第二种不在脚本的控制范围之内,因此脚本必须准备妥善处理它们。示例如下:
要处理这些错误,请阅读您使用的每个函数和方法的文档,确定一次调用何时可能失败并采取相应措施。 Exceptions可能会帮助你。
不处理第二种错误通常会导致第一种错误。例如,如果您不检查mysqli_connect
是否实际建立数据库连接(第二种错误),则以下调用mysqli_query
将产生第一种错误。
在服务器上录音可以通过logging the errors完成,但我认为没有任何明智的方法将这些错误转换为用户友好的消息。而且应该没有办法。
您的应用程序不应该产生任何PHP错误。如果确实如此,那么您可以(也应该)做的唯一一件事情就是向用户提供一条消息,指出事件意外出错。
用户友好的错误消息是您自己创建的消息,通过抛出某些异常或其他形式的错误处理。
听起来好像我没有正确地说明自己。这基本上就是我想要展示的东西,也就是一条消息,只是说出乎意料地出了什么问题。有推荐的方法吗? – oshirowanen
是的,您可以使用set_error_handler调用用户定义的函数&与trigger_error一起使用,您可以获得自定义错误消息。
检查示例#1在set_error_handler页面上使用set_error_handler()和trigger_error()处理错误。
不幸的是,你不能捕捉编译时错误,所以你的代码中的任何语法错误都不能被PHP错误处理能力所捕获。
您可以使用register_shutdown_function
,set_error_handler
和set_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');
我建议你将所有的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
}
这给了你很多的灵活性和嵌套尝试/捕获的可能性当然。
干杯
您的尝试捕捉示例捕获所有可能的错误? – oshirowanen
使用这个技巧,如果你确保首先在它自己的文件中执行set_error_handler,然后只包括下一步(例如在bootstrap.php/init.php文件中),你甚至可以将致命的语法错误作为例外;)是的,这会将所有的php错误/通知/警告转换为异常。即使是致命的。 – smassey
基本上你不显示错误的客户端,但如果你坚持,你可以尝试[下](http://stackoverflow.com/a/14787080/) – HamZa
我想你不得不为用户使用'try catch'块 – asprin
“用户友好”这些消息不适合用户 - 他们是为你。 – AD7six