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

时间:2018-01-06 12:41:27

标签: javascript google-chrome google-chrome-extension

我想创建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)
  }
}

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

1 个答案:

答案 0 :(得分:5)

首先net::ERR_FILE_NOT_FOUND是一个浏览器错误(请参阅Chromium/Chrome error listChrome fail error codes,因此您无法使用JS代码捕获它。

具体而言net::ERR_FILE_NOT_FOUND"并不表示致命错误。通常,此错误将作为通知"生成。

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

但是你无法检查状态,事实上statusstatusTextreadyState XMLHttpRequest属性的值都属于status: 0 statusText: "" readyState: 4 文件存在并且在找不到文件的情况下始终是:

response

相反,您可以查看属性为responseTextresponseURLresponse: <file content> responseText: <file content> responseURL: "file:///..." 的属性,其值为&#34;&#34;何时找不到文件或在其他情况下:

event

要检查的其他值是loaded(ProgressEvent)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(); }); } 属性,如果找不到文件(或在其他情况下加载的字节数),则该值为0。

所以代码可以是:

Iterable