我想创建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)
}
}
我怎样才能发现这类错误?
答案 0 :(得分:5)
首先net::ERR_FILE_NOT_FOUND
是一个浏览器错误(请参阅Chromium/Chrome error list,Chrome fail error codes,因此您无法使用JS代码捕获它。
具体而言net::ERR_FILE_NOT_FOUND
"并不表示致命错误。通常,此错误将作为通知"生成。
所以最好的方法是将onloadend
处理程序附加到XMLHttpRequest
,在Ajax请求完成时触发(成功或失败)。
但是你无法检查状态,事实上status
,statusText
和readyState
XMLHttpRequest
属性的值都属于status: 0
statusText: ""
readyState: 4
文件存在并且在找不到文件的情况下始终是:
response
相反,您可以查看属性为responseText
,responseURL
和response: <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