捕获 XHR 的 404 错误

Posted

技术标签:

【中文标题】捕获 XHR 的 404 错误【英文标题】:Catch a 404 error for XHR 【发布时间】:2021-11-09 18:01:38 【问题描述】:

基本上,我必须创建一个 javascript APP 对象,它将对服务器的一系列异步请求进行排队,处理对 JSON 的响应,并从中记录错误。

JSON 处理错误很容易被“try-catch”捕获,但是像 404、500 等服务器错误仍然显示在浏览器的控制台中,而我需要在“APP.history”中静默记录。

我尝试通过下面的代码来实现它,但没有一个 404 错误会引发一个错误。我做错了什么?

xhr = new XMLHttpRequest();
xhr.open("GET", url, true)
xhr.onerror = function()console.log("error")  
xhr.upload.onerror = function()console.log("error")

顺便问一下,jQuery AJAX怎么能做到呢?

【问题讨论】:

您可以查看xhr.status 的值。见***.com/questions/10931270/… 看看这里>***.com/questions/1442425/…,希望它能回答你的问题 【参考方案1】:

404 状态不会触发 xhr.onerror() 因为从技术上讲它不是错误; 404 本身就是一个有效的响应。

一种解决方案是使用 loadend() 处理程序,无论如何都会触发。然后检查 404 的状态,或您感兴趣的任何状态。

xhr = new XMLHttpRequest();
xhr.open("GET", url, true);

xhr.onloadend = function() 
    if(xhr.status == 404) 
        throw new Error(url + ' replied 404');

XMLHttpRequestUpload 也有同样的方法。 不幸的是,我们的浏览器供应商不允许我们在 2017 年以编程方式抑制网络错误。However, networks errors can be suppressed using the console's filtering options.

【讨论】:

@Tesmen 应该将此答案设为正确答案,因为 404 不是错误。这是一个响应代码。此外,这个答案对我有用。 @Duco 不幸的是,在 event.target.readystate==1 和 event.target.readystate==2 之间的控制台级别报告了错误;在“loadend”发挥作用之前的方式。控制台的输出发生在 就绪状态事件之间;因此,当 readystate==2 通知我们情况时,一条消息(红色墨水)已经喷溅到控制台上。这就是您所说的“我们的浏览器供应商不允许我们以编程方式压制”的意思吗?如果是这样,感谢您解释为什么我无法清理它。 这就是我的意思 IAM_AL_X。用户可以使用开发工具中的过滤器选项停止红色墨水,但程序员无法控制。

以上是关于捕获 XHR 的 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

Springboot ajax xhr 加载失败 404 错误

XHR 错误 (404 Not Found) 加载 http://localhost:3000/traceur

使用 Selenium 捕获 404 错误 [重复]

在 Asp.net Web API 中捕获 404 错误

如何在 urllib.urlretrieve 中捕获 404 错误

JavaScript fetch()无法捕获404的错误