Внутренняя попытка, кроме как в Python - как работает поток?


У нас есть внутренние исключения, такие как

try:

    try: (problem here)

    except: (goes here)

except: (will it go here) ??

Такое, что из текущего потока попробовать исключает ? Если исключение поймано внутри для внешнего блока try, это ошибка или нет?

3   2   2013-02-26 17:26:09

3 ответа:

Нет, он не войдет во второе исключение, если только первое тоже не вызовет исключения.

Когда вы входите в Предложение except, Вы в значительной степени говорите: "исключение поймано, я его обработаю", если только вы не повторите исключение. Например, эта конструкция часто может быть весьма полезной:

try:
    some_code()
    try:
        some_more_code()
    except Exception as exc:
        fix_some_stuff()
        raise exc
except Exception as exc:
    fix_more_stuff()

Это позволяет иметь много слоев "фиксации" для одного и того же исключения.

Он не достигнет внешнего except, Если вы не создадите другое исключение внутри этого, например:

try:
    try:
        [][1]
    except IndexError:
        raise AttributeError
except AttributeError:
    print("Success! Ish")

Если внутренний блок except не создает исключение, соответствующее внешнему блоку, это не будет считаться ошибкой.

Ошибка не ударит по внешнему Except. Вы можете проверить это следующим образом:

x = 'my test'
try:
    try: x = int(x)
    except ValueError: print 'hit error in inner block'
except: print 'hit error in outer block'

Это будет только печатать 'hit error in inner block'.

Однако, скажите вы какой-нибудь другой код после внутреннего Try/Except блок, и это вызывает ошибку:

x, y = 'my test', 0
try:
    try: x = int(x)
    except ValueError: print 'x is not int'
    z = 10./y
except ZeroDivisionError: print 'cannot divide by zero'

Это будет печатать как 'x is not int', так и 'cannot divide by zero'.