繁体   English   中英

如何在XMLHttpRequest中捕获Chrome错误网:: ERR_FILE_NOT_FOUND?

[英]How to catch Chrome error net::ERR_FILE_NOT_FOUND in XMLHttpRequest?

我想创建chrome扩展,它将能够读取本地文件并使用其中编写的代码。 我简单的代码是:

const readFile = (filePath) => {
  return new Promise(function (resolve, reject) {
    const xhr = new XMLHttpRequest()
    xhr.onerror = (error) => {
      reject(error)
    }
    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        resolve(xhr.response)
      }
    }
    xhr.ontimeout = function () {
      reject('timeout')
    }
    xhr.open('GET', filePath)
    xhr.send()
  })
}

async function () {
    const code = await readFile(jsFilePath)
    console.log(code)
}

当我的filePath正确时,此代码成功运行。 但是当它不是Chrome控制台时会抛出此错误:

GET file:///home/maxim/Documents/test.jsa net::ERR_FILE_NOT_FOUND

通常的try / catch块不起作用

async function () {
  try {
    const code = await readFile(jsFilePath)
    console.log(code)
  } catch (e) {
    console.log(e)
  }
}

我怎样才能发现这类错误?

首先net::ERR_FILE_NOT_FOUND是浏览器错误(请参阅Chromium / Chrome错误列表Chrome失败错误代码 ,因此您无法使用JS代码捕获它。

特别是net::ERR_FILE_NOT_FOUND “并不表示致命错误。通常这个错误将作为通知生成”。

因此,最好的方法是将onloadend处理程序附加到XMLHttpRequest ,在Ajax请求完成时触发(无论是成功还是失败)。

但是在文件存在的情况下以及在找不到文件的情况下, 你无法检查状态 ,事实上的status值, statusTextXMLHttpRequest readyState属性总是:

status: 0
statusText: ""
readyState: 4

相反,您可以在找不到文件时检查属性responseresponseTextresponseURL其值为“”或在其他情况下:

response: <file content>
responseText: <file content>
responseURL: "file:///..."

要检查的其他值是event (ProgressEvent) loaded属性,如果找不到文件(或在其他情况下加载的字节),则该值为0。

所以代码可以是:

const readFile = (filePath) => {
    return new Promise(function (resolve, reject) {
        const xhr = new XMLHttpRequest()
        xhr.onloadend = (event) => {
            console.log("xhr.onloadend", event, xhr.status, xhr.statusText, xhr.readyState, xhr);
            if (event.loaded && xhr.response) {
                resolve(xhr.response);
            } else {
                reject("error");
            }
        }
        xhr.open('GET', filePath);
        xhr.send();
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM