如果以下代码返回致命错误,我会在页面上收到一条不希望用户看到的消息。我想隐藏致命错误消息,并将用户重定向到另一个页面:
$jinput = JFactory::getApplication()->input;
为了隐藏错误信息,我刚刚添加了:
error_reporting(E_NONE);
但是,我如何捕捉并重定向这样的致命错误呢?
向用户隐藏错误
这是一个非常常见的误解,人们经常将error_reporting
与display_errors
设置混淆。你需要后者。
ini_set('display_errors', 0);
实际上是对网站访问者隐藏错误的东西。而error_reporting
必须始终保持在E_ALL
。
出现错误时重定向
这种想法违反了HTTP协议最基本的规定。出现不可恢复错误的页面,必须返回5xx状态代码,而不是3xx。因此,您永远不应该进行任何重定向。必须返回一个5xx状态代码(即500),并且您想在此页面上显示的任何内容都必须显示在原位,而不需要重定向。
捕捉致命错误
假设错误是不可恢复的,并且您所能做的只是显示错误页面,那么您真正需要的是一个站点范围的错误处理程序一个捕获错误并执行上述所有操作的代码:返回500 HTTP状态代码,显示一些通用错误页面,并且非常重要的是,log错误消息以供将来检查。为了创建这样的处理程序,您将需要三个函数,set_error_handler()、set_exception_handler)和register_shutdown_function()。在我关于PHP错误报告的文章中,您可以看到使用这三个函数的代码的简化示例。
Basicaly,您不能"捕获"致命错误,因为它们会停止程序执行。但有一种方法可以处理它们。注册您自己的关闭处理程序,并检查上一个错误是否是致命的。
<?php
function shutdownHandler()
{
$error = error_get_last();
if ($error['type'] == E_ERROR) {
your code goes here;
}
}
register_shutdown_function('shutdownHandler');
演示:https://eval.in/137869