Multithreading Python';让我们试试吧——只是没有按预期工作
我在理解Python中异常是如何工作的方面遇到了一些困难 在下面的代码中,Multithreading Python';让我们试试吧——只是没有按预期工作,multithreading,python-3.x,exception,Multithreading,Python 3.x,Exception,我在理解Python中异常是如何工作的方面遇到了一些困难 在下面的代码中,someClass被初始化,并调用run\u engine()方法。 run\u engine()方法生成各种线程,其中一个线程是“数据源”线程。数据源线程在数据库中查询一组特定的数据,数据库将依次开始对查询的数据集进行流式传输(subpub机制)。当completedata集被传输到我的Python应用程序时,数据库将关闭与数据源线程的连接,以指示流已经结束,并且可能发生其他操作。问题就从这里开始 在下面的\u fetc
someClass
被初始化,并调用run\u engine()
方法。
run\u engine()
方法生成各种线程,其中一个线程是“数据源”线程。数据源线程在数据库中查询一组特定的数据,数据库将依次开始对查询的数据集进行流式传输(subpub机制)。当completedata集被传输到我的Python应用程序时,数据库将关闭与数据源线程的连接,以指示流已经结束,并且可能发生其他操作。问题就从这里开始
在下面的\u fetch_data()
方法中,我正在捕获QReaderException
(在db断开连接时引发的一个异常)并引发一个自定义异常(ServiceExitException
),以便在主线程中执行一些最终操作
出于某种原因,它会打印两个异常的stacktrace(因此QReaderException
似乎被捕获,但不会悄悄地通过
为什么会发生这种情况?这与我的应用程序的线程性质有关吗
谢谢
# This method belongs to the data source thread
def _fetch_data(self):
while not self.stopped():
try:
message = self.connections[self.port].receive(data_only=False, raw=False) # retrieve entire message
if message.type != MessageType.ASYNC:
raise UnexpectedMessageTypeException('Unexpected message, expected message of type: ASYNC')
if isinstance(message.data, list):
return message
except (QReaderException, UnexpectedMessageTypeException) as e:
# this block seems to be executed
raise ServiceExitException()
if __name__ == '__main__':
someClass = SomeClass()
try:
someClass.run_engine()
while True:
time.sleep(0.5)
except ServiceExitException as e:
someClass.stop_engine()
someClass.join()
someClass.store_data()
sys.exit(0)
在这两者之间应该有一条线,比如 在处理上述异常期间,发生了另一个异常: 可以说,Python在except块结束之前不会将第一个异常视为已处理。因此,它们都被视为未处理,并且回溯被合并为一个 如果你使用
raise ServiceExitException() from e
然后,回溯之间的消息变为
上述异常是以下异常的直接原因:
不过,这样的异常重定向已经足够了。我想最简单的方法就是去掉自定义的ServiceExitException
,只剩下主代码中的所有内容。或者更好的方法是,使用try:…finally:…
构造,这样可以避免诸如告诉我你不应该做除s以外的所有捕捉