是否可以覆盖CodeIgniter框架的默认错误处理程序以将其输出为json?[已关闭]

shstlldc  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(138)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

我们不允许问题寻求书籍、工具、软件库等的建议。您可以编辑问题,以便使用事实和引文来回答。
六年前就关门了。
此帖子在6个月前已编辑并提交审核,未能重新打开:
原始关闭原因未解决
Improve this question
CodeIgniter的show_error函数处理错误,是否有某种方法可以覆盖它,将错误信息作为json对象输出?

vfwfrxfs

vfwfrxfs1#

如果你想返回像数组这样的复杂错误对象(虽然你可以,但是你必须在客户机上解析json),这个解决方案可能并不完全有用,但是我们开始吧:

仅使用HTTP

为什么呢?你可以传递第二个参数给它,它恰好是HTTP响应代码,这很酷,因为它允许你让你的应用程序支持HTTP,这对客户端 AJAX 请求来说非常好。
你要做的是首先定义什么样的错误可以发生在后端,有一个HTTP错误代码here的列表。

HTTP错误代码

最有可能的错误代码是200、400和500。实际上,当你在浏览器上点击一个服务器时,它通常会收到一个200的http响应代码,这意味着一切都很好。
你看过那些“内部服务器错误”的消息吗?它们是500个http响应代码。这就是说,这是一个来自服务器的错误。哪一个?这取决于你如何分类它们,有一组500范围内的错误,但如果你不想麻烦,就使用500通用错误代码响应。
另一个范围是400。这些通常是用户的错误,例如,如果您转到服务器内的URL,但它不存在,您会得到著名的404未找到,400是一个通用错误代码,意味着客户端404错误提示-页面未找到抱歉,你所请求的页面不存在!“点击返回首页这是一个客户端错误,因为您应该知道服务器上有哪些资源可用。

如何在codeigniter中实现

实际上它非常简单。如果你在文档中看到show_error()参考,它说明该方法接收第一个参数作为错误消息,第二个参数(可选)接收错误代码。哪个错误代码?我们之前讨论过的HTTP代码,例如:

show_error('Howdy, this is my debug message', 500);

会向客户端发送一个500 HTTP响应代码,包括您的消息。

如何在 AJAX 中捕获

考虑到您使用的是jQuery,这是您通常会做的事情:

$.ajax({
    type: 'POST',
    url : example.com/resource,
    data: $("#some-form").serialize(),
    dataType: 'json',
    success : function(data, textStatus, req) {
        //do something with data which is a json object returned from PHP
    },
    error: function(req, textStatus, errorThrown) {
        //this is going to happen when you send something different from a 200 OK HTTP
        alert('Ooops, something happened: ' + textStatus + ' ' +errorThrown);
    }
});

如果您使用任何其他工具包,甚至直接使用DOM对象,您仍然可以捕获这些对象,因为它们只是XMLHttpRequest objects,并且您的工具包可能具有HTTP错误响应或成功响应的回调。
"我为什么要在乎"
因为它遵循标准,所以更容易调试,您可以将该工作委托给show_error()帮助程序,它存在是有原因的,最重要的是因为所有的cool kids are using it

酷,但是等一下,我没有看到我的自定义错误消息!

这是正确的,因为当你在jquery的错误回调中捕捉到请求时,你得到的是一般的错误描述和代码,分别是“内部服务器错误”和500,然而,你仍然会得到一个漂亮的html响应和自定义的调试消息,要看到它,只需要使用一些火狐或Chrome的开发者工具。例如,如果你使用谷歌Chrome,你可以打开开发者工具:
转到网络选项卡,您将看到HTTP请求,单击其名称

您将看到详细信息和您的自定义错误消息以及通常的CI模板,这是随请求中的消息一起返回的html

最后,如果你想进一步挖掘和调试从php/web服务器发送到客户端的内容,请转到header选项

**免责声明:**屏幕快照不是从生产服务器上获取的:)

a9wyjsp7

a9wyjsp72#

在“奥利弗·史密斯”的博客上找到了答案。
我通过使用以下内容扩展CI_Exceptions,将此函数添加到CI核心函数中:

function show_error($heading, $message, $template = 'error_general', $status_code = 500)
{
    header('Cache-Control: no-cache, must-revalidate');
    header('Content-type: application/json');
    header("HTTP/1.1 500 Internal Server Error");

    echo json_encode(
        array(
            'status' => FALSE,
            'error' => 'Internal Server Error',
            'message' => $message
        )
    );

    exit;
}

所有的功劳都归“奥利弗·史密斯”。

相关问题