Продолжить после повышения исключений в итераторе / генераторе в python - PullRequest
5 голосов
/ 19 сентября 2011

Есть ли в Python способ продолжить итерацию после исключения, генерируемого итератором / генератором? Как и в приведенном ниже коде, есть ли способ пропустить ZeroDivisionError и продолжить цикл по gener() без модификации run() функции?

def gener():
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9]
    for i in a:
        yield 2/i

def run():
    for i in gener():
        print i

#---- run script ----#

try:
    run()
except ZeroDivisionError:
    print 'what magick should i put here?'

Ответы [ 3 ]

9 голосов
/ 19 сентября 2011

Логическим местом для try/except будет место, где происходит оскорбительный расчет:

def gener():
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9]
    for i in a:
        try:
            yield 2/i
        except ZeroDivisionError:
            pass
2 голосов
/ 19 сентября 2011

Одним из возможных решений является просто завершение кода проблемы в try ... кроме блока:

def gener():
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9]
    for i in a:
        try:
            div_result = 2/i
        except ZeroDivisionError:
            div_result = None

        yield div_result
1 голос
/ 22 июня 2017

Я не уверен, но, может быть, это подходит вам лучше, если вы хотите понять, где произошли ошибки:

In [1]: def gener():
   ...:     a = [1, 2, 0, 3, 4, 5, 6, 7, 8, 9]
   ...:     errors = []
   ...:     for idx, i in enumerate(a):
   ...:         try:
   ...:             yield 2 / i
   ...:         except ZeroDivisionError:
   ...:             errors.append('ZeroDivisionError occured at idx = {}'.for
   ...: mat(idx))
   ...:     if errors:
   ...:         raise RuntimeWarning('\n'.join(errors))
   ...:     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...