Как мы можем выполнить выход типа необработанного исключения «рано»? - PullRequest
0 голосов
/ 11 мая 2018

Как мы можем выйти из сценария с необработанным отслеживанием исключений, проходя через все операторы catch во внешних блоках try-catch, в которые мы вложены?

Предположим, мы определили следующие функции:

import sys

def foo():
    try:
        bar()
        list()[592]
    except IndexError:
        print('`foo()` be handling error generated by list()[592]')
    return

def bar():
    try:
        list()[345]
    except IndexError:
        pass
        ### MAGIC GOES HERE ###
    return

Теперь мы делаем вызов: foo ()

Мне бы хотелось, чтобы оператор catch в bar() убил процесс.

Мы не хотим, чтобы foo() ловил IndexError, и определенно не хотим напечатать 'foo()' be handling error generated by list()[592].

Если мы заменим ### MAGIC GOES HERE ### на что-то вроде sys.exit(-20374290374),затем мы успешно завершаем процесс, но нет обратной трассировки, и нет никакой информации о «неперехваченном» исключении.

Как мы можем выйти, как если бы исключение было обработано, не пройдя сначала всевнешние пробные блоки?

1 Ответ

0 голосов
/ 11 мая 2018

Вы поднимаете что-то, что не поймано:

import sys

class MyException(Exception):
    pass

def foo():
    try:
        bar()
        list()[592]
    except IndexError:
        print('`foo()` be handling error generated by list()[592]')
    return

def bar():
    try:
        list()[345]
    except IndexError: 
        raise MyException("step out")
    return



foo()

Вывод:

Traceback (most recent call last):
  File "main.py", line 26, in <module>
    foo()
  File "main.py", line 10, in foo
    bar()
  File "main.py", line 21, in bar
    raise MyException("step out")
__main__.MyException: step out

На случай, если вы где-нибудь поймаете базу Exception (-не следует-) вам нужночтобы проверить ваш особый вид и поднять его:

except Exception as e:
    if isinstance(e,MyException):
        raise # e not needed, raise rethrows last one
    print('`foo()` be handling error generated by list()[592]')
...