目前,我的 PHP 页面上有以下内容:
error_reporting( E_ALL | E_STRICT );
ini_set('display_errors', 1);
当出现问题时,是否有推荐的方法用更用户友好的消息替换它?但同时,在某处记录服务器上的错误?
因此,我不想显示完整的错误消息,而是希望用户知道出了问题,并且会尽快纠正。发生的完整错误被记录在后台而不向用户显示。
目前,我的 PHP 页面上有以下内容:
error_reporting( E_ALL | E_STRICT );
ini_set('display_errors', 1);
当出现问题时,是否有推荐的方法用更用户友好的消息替换它?但同时,在某处记录服务器上的错误?
因此,我不想显示完整的错误消息,而是希望用户知道出了问题,并且会尽快纠正。发生的完整错误被记录在后台而不向用户显示。
错误来自两个来源:
第一种错误来自程序中的错误,需要在那里修复。例子是:
string
或 an上int
)bool
给mysqli_query
)。display_errors
在开发系统上,打开并没有错。在生产服务器上,关闭display_errors
然后再打开log_errors
。这会将错误记录到您的 Web 服务器的日志中。通过实现自己的错误处理程序并将其注册到set_error_handler
.
第二种错误超出了您的脚本的控制范围,因此您的脚本必须准备好优雅地处理它们。例子是:
要处理这些错误,请阅读您使用的每个函数和方法的文档,确定调用何时会失败并采取相应措施。例外情况可能会对您有所帮助。
不恰当地处理第二种错误通常会导致第一种错误。例如,如果您不检查是否mysqli_connect
实际建立了数据库连接(第二种错误),则以下调用mysqli_query
将产生第一种错误。
我建议您将所有 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 的可能性。
干杯
在服务器上记录可以通过记录错误来完成,但我认为没有任何明智的方法可以将这些错误转换为用户友好的消息。而且不应该有办法。
您的应用程序不应产生任何 PHP 错误。如果是这样,您唯一可以(并且应该)做的就是向用户显示出现意外错误的消息。
用户友好的错误消息是您自己创建的消息,通过抛出某些异常或其他形式的错误处理。
是的,您可以使用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');