2015-03-28 2 views
3

Я пытаюсь выбросить исключение из тела функции генератора ES6, но это не проходит. Является ли эта часть спецификации ES6 или причудой Babel?(Почему) Могу ли я исключить исключение из генератора?

Вот код, который я попробовал (on babeljs.io):

function *gen() { 
    throw new Error('x'); 
} 

try { 
    gen(); 
    console.log('not throwing'); 
} catch(e) { 
    console.log('throwing'); 
} 

Если это действительно указано поведение ES6, что альтернативный подход для сигнализации исключения?

ответ

6

Вы создали итератор, но не запускали его.

var g = gen(); 
g.next(); // throws 'x' 

(on babel repl)

Вот еще один пример:

function *gen() { 
    for (let i=0; i<10; i++) { 
     yield i; 
     if (i >= 5) 
      throw new Error('x'); 
    } 
} 

try { 
    for (n of gen()) 
     console.log(n); // will throw after `5` 
    console.log('not throwing'); 
} catch(e) { 
    console.log('throwing', e); 
} 
+0

Спасибо! Это имеет смысл, в ретроспективе. Если я хочу выдать исключение до вызова '.next()', мне придется создать нормальную функцию для обертывания функции генератора. – mhelvens

+0

Было бы полезно бросить 'StopIteration'. – user5321531

Смежные вопросы