在ES6中,当调用throw时,是否会执行throw语句下面的代码?

use*_*947 2 javascript ecmascript-6

在节点中,我习惯于使用回调来处理错误.

我试图跳转到异步...等待,它使用我不习惯的错误处理方法.

我想知道,当调用throw时,是刚执行的throw语句下面的代码吗?换句话说,我需要这样做吗......

async fetch() {
    if (somethingBad) {
        throw new Error('Cannot fetch')
    } else {
        let result = await this.read(this.get('id'))
        return result
    }
}
Run Code Online (Sandbox Code Playgroud)

......或者仅仅这样做是否足够:

async fetch() {
    if (somethingBad) throw new Error('Cannot fetch')
    let result = await this.read(this.get('id'))
    return result
}
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 6

在ES6中,当调用throw时,是否会执行throw语句下面的代码?

不它不是.在异步函数中,throw表示立即返回被拒绝的承诺.这很像是这样做的:

return Promise.reject(new Error('cannot fetch'));
Run Code Online (Sandbox Code Playgroud)

它立即退出您的函数并返回一个被拒绝的promise,其原因设置为您使用的任何值throw.

关于async函数的一个好处是它们自动捕获异常并将它们转换为被拒绝的promise,因为async函数的契约是它总是返回一个promise.


仅供参考,在非异步功能(例如,只是常规功能)中,功能的其余部分也不会执行.该功能立即暂停.你抛出了一个异常,它会在调用链中向上传播,直到找到异常处理程序或顶层(它将是一个未处理的异常).