异常处理
抛出异常
程序运行时不符合预期的代码都可能抛出异常,并中断后续代码的执行。除了语法层面上的错误可能会抛出异常,我们也可以自行通过throw new Error('')
来抛出异常。
throw new Error('手动抛出的错误')
console.log('akara') // 不会输出
Error类型
Error
实例包括以下有用的属性:
message
:错误消息。name
:错误名称,为构造函数的名称。stack
:错误堆栈。
class MyError extends Error {
constructor(...props) {
super(...props)
this.name = 'MyError'
}
}
try {
throw new MyError('myMessage')
} catch (error) {
console.error(error.name + ': ' + error.message)
console.error(error.stack)
}
除了自行定义错误类型,JavaScript内部还提供了一些其他异常类型都是基于该类的,包括但不限于:
- EvalError:执行
eval()
时可能抛出。 - RangeError:数值变量或参数超出其有效范围
- ReferenceError:无效引用,尝试引用一个未被定义的变量时,将会抛出此异常
- SyntaxError:各种语法错误,如重复声明一个变量两次
Promise中的异常
在Promise内部也可以使用throw
来抛出异常,这将使得Promise实例的状态变成rejected
。
const p1 = new Promise(() => {
throw new Error('test')
})
const p2 = p1.then(() => {
throw new Error('test')
})
async function test() {
throw new Error('test')
}
const p3 = test()