Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript ES6生成器在下一个方法之前捕获错误_Javascript_Generator - Fatal编程技术网

JavaScript ES6生成器在下一个方法之前捕获错误

JavaScript ES6生成器在下一个方法之前捕获错误,javascript,generator,Javascript,Generator,我开始学习迭代器/生成器,有时我会看到一些奇怪的部分。目前我不明白为什么我的代码是这样工作的 下面的代码示例是我的主要代码 function* makeGenerator() { try { yield 1; yield 1; yield 1; } catch (e) { console.log(e); } } const generator = makeGenerator(); 当我在抛出前使用下一个方

我开始学习迭代器/生成器,有时我会看到一些奇怪的部分。目前我不明白为什么我的代码是这样工作的

下面的代码示例是我的主要代码

function* makeGenerator() {
    try {
        yield 1;
        yield 1;
        yield 1;
    } catch (e) {
        console.log(e);
    }
}

const generator = makeGenerator();
当我在抛出前使用下一个方法时,此代码正常工作

console.log(generator.next()); // { done: false, value: 1 }
console.log(generator.throw("WTF?")); // "WTF"
console.log(generator.next()); // { done: true, value: undefined }
函数*makeGenerator(){
试一试{
产量1;
产量1;
产量1;
}捕获(e){
控制台日志(e);
}
}
const generator=makeGenerator();
console.log(generator.next());//{完成:false,值:1}
console.log(生成器.throw(“WTF?”);//“WTF”

console.log(generator.next());//{done:true,value:undefined}
通过生成器抛出错误的正确方法是将它们包装在一个
try…catch
中,因为如果没有捕捉到错误,您就在那里创建了一个错误,那么它将落入外部调用代码(如果有)中,如果没有捕捉,则会杀死脚本

function* makeGenerator() {
    try {
        yield 1;
        yield 1;
        yield 1;
    } catch (e) {
        console.log(e);
    }
}

const generator = makeGenerator();
console.log(generator.next()); 
try {
  generator.throw(new Error("WHOOPS"));
} catch(e) {
  console.log(e); // shows the error
}

执行此语句时:

const generator = makeGenerator();
…函数体中的
makeGenerator
代码尚未执行,因此其
try/catch
块尚未生效。只有在执行
generator.next()
时,
makeGenerator
函数体中的代码才会开始执行,直到下一个
产生
。此时,
try/catch
块生效

所以。。。如果在第一个
generator.next()
调用之前调用
generator.throw()
,则触发的异常不由
makeGenerator
代码处理。您的代码因未处理的异常而中断。因此,
generator.throw()
(在您的第二个代码版本中)之后的任何内容都不会执行