Предположим, что:
TEF
является блоком try-except-finally
. - возникает исключение из условия
try
в TEF
- Предложение finally,
F
блока T
содержит оператор возврата TEF
содержит исключающее предложение E
- исключение
e
возникает внутри E
- Как мы можем поймать
e
снаружи предложения F
и снаружиE
?
Если это сбивает с толку, то ниже показан код:
def e():
out = "hello world"
try:
raise ValueError("my name is Sarah")
except BaseException as exc:
# HOW DO I CATCH THE FIRST OF THE FOLLOWING
# exceptions from outside of this, current,
# except clause?
raise ValueError("secret info it would be good to know")
raise AttributeError
raise type("Hell", (Exception,), dict())()
[0, 1, 2][99999]
class AnythingYouCanThinkOf(Exception):
pass
raise AnythingYouCanThinkOf
out = "definitely not `hello world`"
finally:
return out
print(e())
print("No error!!! wowza!")
Код выше печатает:
hello world
No error!!! wowza!
Если мы закомментируем строку out = "hello world"
, то получим UnboundLocalError: local variable 'out' referenced before assignment
. Тем не менее, я все еще не уверен, как восстановить ValueError("secret info it would be good to know")
Кроме того, если вы поместите почти тот же код вне функции e
, вы получите очень разные результаты. Почему?
if True:
out = "hello world"
try:
raise ValueError("my name is Bob")
except BaseException as exc:
# HOW DO I CATCH THE FIRST OF THE FOLLOWING
# exceptions from outside of this, current,
# except clause?
raise ValueError("what is this madness?")
class AnythingYouCanThinkOf(Exception):
pass
raise AnythingYouCanThinkOf
out = "definitely not `hello world`"
finally:
print(out)
Вышеуказанное приводит к необработанному исключению ValueError: what is this madness?
до того, как мы получили No error!!! wowza!