JS
的常见错误的捕获方式
同步错误
一、 SyntaxError
:语法错误
语法错误,这一类错误在预解析的过程中如果遇到,就会导致整个js
文件都无法执行。在vue
项目中如果存在语法错误,将直接无法运行,打包也将会直接报错
二、Uncaught ReferenceError
:引用错误
引用一个不存在的变量时发生的错误。将一个值分配给无法分配的对象,比如对函数的运行结果或者函数赋值。此类错误可以通过try-catch
捕获到
try {
a()
} catch(e) {
console.log('捕获到错误引用的错误==>',e)
// 捕获到错误引用的错误==> Uncaught ReferenceError: a is not defined
}
复制代码
三、RangeError
:范围错误
RangeError
是当一个只超出有效范围时发生的错误。主要的有几种情况,第一是数组长度为负数,第二是Number
对象的方法参数超出范围,以及函数堆栈超过最大值。此类错误可以通过try-catch
捕获到
try{
[].length=-5
} catch(e) {
console.log('捕获到范围错误==>',e)
// 捕获到范围错误==> Uncaught RangeError: Invalid array length
}
复制代码
四、TypeError
:类型错误
变量或参数不是预期类型时发生的错误。比如使用new字符串、布尔值等原始类型和调用对象不存在的方法就会抛出这种错误,因为new命令的参数应该是一个构造函数。此类错误可以通过try-catch
捕获到
try{
const a = {}
a()
} catch(e) {
console.log('捕获到类型错误==>',e)
// 捕获到类型错误==> TypeError: a is not a function
}
复制代码
五、URIError,URL
错误
主要就是相关函数的参数不正确;URI相关参数不正确时抛出的错误,主要涉及encodeURI、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()
六个函数。此类错误可以通过try-catch
捕获到
try{
decodeURI('%')
} catch(e) {
console.log('捕获URI错误==>',e)
// 捕获URI错误==> URIError: URI malformed
// at decodeURI (<anonymous>)
}
复制代码
异步错误
一、promise/async-await
错误
Promise
是异步编程的一种解决方案,比传统的解决方案callback
更加的优雅。它最早由社区提出和实现的,ES6
将其写进了语言标准,统一了用法,原生提供了Promise
对象。Promise
虽然可以避免回调地狱,但是一旦出现问题,无法使用try-catch
进行捕获;这就对我们的错误捕获及处理就造成了不必要的麻烦。
好在ES8
加入了对async/await
的支持,也就我们所说的异步函数
,这是一个很实用的功能。 async/await
将我们从头痛的回调地狱中解脱出来了,使整个代码看起来很简洁。async-await
的加入是我们又可以使用try-catch
捕获异步的错误了
async function test (){
try {
// 假设a是一个异步函数
await a()
} catch(e){
console.log('捕获到异步的错误==>',e)
}
}
复制代码
二、settimeout/setinterval/callBack
错误
在vue
中可以使用window.onerror()
进行监听settimeout/setinterval/callBack
的错误;
window.onerror = (message,url,lineNo,cloumnNo,error) => {
// message 错误信息
// url 文件名
// lineNo 行号
// cloumnNo 列号
// error 错误信息
}
复制代码
资源加载错误
使用window.addEventListener('error')
捕获,window.onerror
捕获不到资源加载错误;window.onerror
和window.addEventListener('error')
的异同:相同点是都可以捕获到window
上的js
运行时错误。区别是1.捕获到的错误参数不同 2.window.addEventListener('error')
可以捕获资源加载错误,但是window.onerror
不能捕获到资源加载错误
AJAX请求错误
这个错误可以在axios的请求拦截器中进行捕获该错误
所有评论(0)