Python обработка ошибок после обработки ошибки внутри блока try-кроме - PullRequest
0 голосов
/ 29 января 2020
try:
    print(1)
    assert 2 + 2 == 5
except AssertionError:
    print(3)
except:
    print(4)

В этом коде после обработки этой ошибки подтверждения с помощью except AssertionError: except: print(4) не работает.

Но если я создам ошибку после AssertionError, например:

try:
    print(1)
    assert 2 + 2 == 5
except AssertionError:
    print(3)
    print(2/0)
except:
    print(4)

выдает такую ​​ошибку:

Traceback (most recent call last):
  File "<pyshell#14>", line 3, in <module>
    assert 2 + 2 == 5
AssertionError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#14>", line 6, in <module>
    print(2/0)
ZeroDivisionError: division by zero

Но почему? Предполагается, что кроме этой ошибки тоже. Потому что эта ошибка происходит внутри блока try, кроме.

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Как правильно описывает первый ответ , ZeroDivisionError не встречается внутри блока try. Если вам нужно перехватить это исключение из первого блока except, вам нужно сделать что-то вроде:

try:
    print(1)
    assert 2 + 2 == 5
except AssertionError:
    try:
        print(3)
        print(2/0)
    except:
        print(4) # this except block will execute during print(2/0)
except:
    pass #this except block will never execute
0 голосов
/ 29 января 2020

В блоке try - except фильтруются только те ошибки, которые произошли в операторе try. Например, если вы хотите запустить последний except вместо AssertionError, вы можете попробовать:

try:
    print(1)
    raise(IOError) #To trigger the last except
    assert 2 + 2 == 5
except AssertionError:
    print(3)
except:
    print(4)

, который должен выдать:

1
4

Помните, что при любых ошибках не в выражении try напрямую не может быть отфильтровано except.

...