【问题标题】:Python's try - except not working as expectedPython 尝试 - 除了没有按预期工作
【发布时间】:2023-04-05 01:41:01
【问题描述】:

我在理解异常在 Python 中的工作原理时遇到了一些麻烦。

在下面的代码中,someClass 被初始化并调用了run_engine() 方法。
run_engine() 方法产生各种线程,其中一个线程是“数据源”线程。数据源线程向数据库查询一组特定的数据,而数据库将依次开始流式传输(sub-pub 机制)查询的数据集。当完整的数据集传输到我的 Python 应用程序时,数据库将关闭与数据源线程的连接,以指示流已经结束,可能会发生其他操作。这就是麻烦的开始。

在下面的_fetch_data() 方法中,我正在捕获QReaderException(在数据库断开连接时引发的那个)并引发一个自定义的(ServiceExitException),以便在主线程中执行一些最终操作.

由于某种原因,它打印了两个异常的堆栈跟踪(所以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)

【问题讨论】:

    标签:
    multithreading
    python-3.x
    exception