【发布时间】:2016-05-06 20:15:02
【问题描述】:
我写了以下代码,它引发了一个异常,而一个线程不断改变引发的异常的类:
import threading
import time
class Foo(Exception):
pass
class Bar(Exception):
pass
class MyExc(Exception):
pass
b = True
e = MyExc()
def mess():
global e
global b
time.sleep(0.00000000000000000000001)
while b:
e.__class__ = Bar
e.__class__ = Foo
threading.Thread(target=mess).start()
try:
try:
try:
try:
try:
raise e
except Foo:
print(1)
except Foo:
print(2)
except Foo:
print(3)
except Foo:
print(4)
except Foo:
print(5)
except Bar:
print('bar')
except MyExc:
print('myexc')
b = False
使用 CPython,不同的时间会使其打印 1、bar 或 myexc(您可能需要稍微调整睡眠时间才能获得其中三个)。但绝不是其他号码。
为什么?是不是因为 CPython 在展开堆栈时没有运行其他线程?
【问题讨论】:
-
我不明白为什么它会打印除 1 之外的任何数字。如果例外是 Foo,将打印 1;为什么会触发任何其他
except块? -
因为最初,异常不是 Foo 的实例。但是,我希望线程在 Python 展开堆栈时使其成为 Foo 的实例,触发中间的 except 语句之一
标签: python multithreading exception cpython