这个超时错误('TimeOutError')没有被捕获。

3

我不明白为什么有时候在我的flash_serial_buffer方法中无法捕获TimeOutError

运行程序时,有时会发生未被捕获的TimeOutError错误,我无法理解原因。我指示了信号处理程序的代码和未捕获TimeOutError错误的方法。这是怎么回事?

以下是我的信号处理程序定义和回调函数的代码。

基本上,如果时间结束,就会调用信号处理程序并引发超时错误。

def signal_handler(signum, frame):
    print "PUM"
    raise TimedOutError("Time out Error")

signal.signal(signal.SIGALRM, signal_handler)

清空串行缓冲区如果没有回答则阻塞。

answer = xbee.wait_read_frame()

清除缓冲区中的所有内容直到没有更多消息为止。当没有更多消息时,它只是等待 SIGALRM 触发并引发超时错误。

def flush_serial_buffer(xbee):

    # Flush coordinators serial buffer if problem happened before
    logging.info("     Flashing serial buffer")
    try:
        signal.alarm(1)  # Seconds
        while True:
            answer = xbee.wait_read_frame()
            signal.alarm(1)
            logging.error("    Mixed messages in buffer")
    except TimedOutError:
        signal.alarm(0)  # Seconds
        logging.error("    No more messages in buffer")

    signal.alarm(0) # Supposedly it never leaves without using Except, but...

TimeOutError会在什么情况下被触发,但不会被try:语句捕获?

这是我的错误类定义:

class TimedOutError(Exception):
pass

我能够再次重现这个错误。我真的不明白为什么try语句没有捕获到这个错误。

INFO:root:     Flashing serial buffer
PUM
Traceback (most recent call last):
  File "/home/ls/bin/pycharm-community-4.0.6/helpers/pydev/pydevd.py", line 1458, in trace_dispatch
    if self._finishDebuggingSession and not self._terminationEventSent:
  File "/home/ls/PiProjects/Deployeth/HW-RPI-API/devices.py", line 42, in signal_handler
    raise TimedOutError("Time out Error")
TimedOutError: Time out Error

2
是因为异常被称为TimeoutException吗? - wflynny
我仔细看了一下你说的@wflynny,那个TimeoutException不应该在Xbee模块内被捕获吗? - LPS
你在修改之前和现在的问题都很难解释,因为在文本中你声称错误是 TimeOutError,但是在代码中我只看到了 TimedOutError(有一个 d)。最初,问题的写法不清楚异常定义在哪里——合理地假设你做了类似于 from xbee import * 的事情。 - wflynny
@wflynny,你觉得我应该使用xbee模块中的TimeOutException而不是使用自己的带有TimedOutError的警报来解决非阻塞读取问题吗? - LPS
看起来 signal_handler 在一个不同的线程中运行,而不是你的 try..catch 块。我对 serial 不熟悉,所以这可能完全错误,但未捕获异常和你发布的回溯信息一致支持这个理论。 - J0HN
显示剩余3条评论
1个回答

0
我建议在这种情况下用以下代码替换try和except代码:
try:
    signal.alarm(1)  # Seconds
    while True:
        answer = xbee.wait_read_frame()
        signal.alarm(1)
        logging.error("    Mixed messages in buffer")
except:
    signal.alarm(0)  # Seconds
    logging.error("    No more messages in buffer")

PS:在try和except语句中,您不需要包含try(任何错误)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接