当前位置: 代码迷 >> python >> 没有捕获超时错误
  详细解决方案

没有捕获超时错误

热度:85   发布时间:2023-06-13 16:56:27.0

大家好,我的问题是下面,我不明白为什么有时我不能赶上TimeOutError我里面flash_serial_buffer方法。

在运行我的程序时,我有时会得到一个未被捕获的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 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  

在这种情况下,我建议将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(无论错误)。

  相关解决方案