在我目前的项目中,我正在使用普通的HTTP请求查询PHP,但也通过AJAX查询,我有时会返回JSON格式的数据,有时返回普通文本。发生错误时,在正常请求中,您会看到错误消息并可以对其执行某些操作。另一方面,对于AJAX请求,您无法确定是否收到错误或您想要的数据,因为它不会直接显示 - 您只是遇到麻烦,因为您的应用程序将无法再运行。
所以我想到了一个错误处理系统。我最好的想法是在发生错误时发送一个500“内部服务器错误”标题,所以在我的JS中,当我发送一个AJAX-Request时,我可以简单地检查错误并处理它。
不幸的是,PHP本身并没有发送那种标题(就像你有一个解析错误,或者你的代码出错了)。
你可以:
a)如果发生错误,请告诉PHP发送500之类的标题?或
b)使用set_error_handler发送500头,然后调用PHP常规错误处理?或
c)当发生PHP错误时,你能以任何其他方式发送错误标题吗?
答案 0 :(得分:7)
我更喜欢使用Exceptions来处理错误。首先,您需要安装错误到异常的错误处理程序(http://php.net/manual/en/class.errorexception.php,示例1),然后将主应用程序代码包装在try-catch块中并发送catch部分中的适当头。例如:
try {
$myApplication->run();
} catch(Exception $e) {
// log or otherwise register the error
header('HTTP/1.1 500 Internal Server Error');
}
不幸的是,这不适用于所谓的“致命错误”,处理这些你必须使用这样的愚蠢技巧
ob_start();
register_shutdown_function(function() {
$p = ob_get_contents();
if(preg_match('~Fatal error~', $p))
header('HTTP/1.0 500 Internal Server Error');
});
...your code...
答案 1 :(得分:3)
另一方面,使用AJAX请求 你不能确定是否收到错误 或者你想要的数据,因为它不是 直接显示 - 你刚刚遇到 麻烦,因为你的应用程序将无法正常工作 了。
是的,你可以。
当数据传输成功时,您的XHR success
回调会触发。给定应用程序层逻辑错误,该数据可能是一些错误消息。您的success
回调可以并且应该解析从服务器获取的数据,并确定是否存在错误。
所以我想到了 错误处理系统。我最好的主意是 发送500“内部服务器错误” 标题如果发生错误,所以在我的 JS,当我发送AJAX-Request时,我可以 只需检查错误的方式和 处理它。
当您的Web服务器内部出现错误时,会生成“内部服务器错误”。您的网络服务器内部没有错误;您的应用程序中存在逻辑错误。因此,手动调用此类状态代码是不合适的。
不幸的是PHP没有发送它 标题的类型(就像你有一个标题 解析错误或代码中的某些内容 出错了)本地。
上面有充分的理由。存在不同的类错误,并且PHP /应用程序错误不会阻止Web服务器执行其工作。 HTTP请求仍然成功(它可能不包含您希望的信息)。
考虑登录表单。当您尝试登录Facebook但意外输错密码时,您是否收到500内部服务器错误?没有。你得到一个网页,正确交付200 OK状态代码,其文字说“哎呀,你的密码错了”。
以上都说过,我现在回答你的问题。
a)告诉PHP发送500之类的标题 如果发生错误?或b)使用 set_error_handler发送500头 然后定期调用PHP ErrorHandling中?或者c)你可以吗? PHP的其他方式sen错误标题 发生错误?
在上述所有情况下,无论何时您想发送状态标头,都可以使用库header功能执行此操作。
header('HTTP/1.1 500 Internal Server Error');
你可以在错误处理程序中或任何你喜欢的地方写这个。
你不能做的是控制发生PHP解析错误时会发生什么。您的应用程序将不得不假设您已经测试了所有PHP脚本并进行了解析;这似乎不是一件难以保证的事情。
答案 2 :(得分:2)
使用header()
功能。
header('HTTP/1.1 500 Internal Server Error');
答案 3 :(得分:0)
您可以使用PHP的header()函数设置返回不同的标题。
实际上,您应该只对不可恢复的服务器错误使用5xx错误 - 因此在set_error_handler中您可以检查错误级别并在需要时返回500.
对于您可以处理的错误,您可以考虑可用4xx状态代码的范围,或在返回的JSON中包含错误信息数组
答案 4 :(得分:0)
使用set_error_handler()
和set_exception_handler()
,您可以在发生错误时运行自己的代码。
这不会捕获PHP启动错误,并且在设置错误处理程序之前解析的任何PHP代码中都没有解析错误,但所有其他错误都应该是可以捕获的。