【问题标题】:Time Out error not being caught未捕获超时错误
【发布时间】:2016-01-21 01:30:17
【问题描述】:

您好,我的问题如下,我不明白为什么有时我无法在 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 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  

【问题讨论】:

  • 是不是因为异常调用TimeoutException
  • 我仔细看了你说的@wflynny,不应该在Xbee模块中捕获TimeoutException吗?
  • @wflynny 我正在导入 Xbee 模块。我正在谈论的 TimedOutError 类是由我在我自己的模块中定义的,这是我没有注意的异常。我正在等待能够重复错误以将其粘贴到此处。
  • 您在编辑之前的问题(现在仍然如此)很难解释,因为在文本中您声称错误是 TimeOutError 但在代码中我只看到 TimedOutError(带有 d)。最初,问题的编写方式并不清楚异常是在哪里定义的——假设你做了类似from xbee import *的事情是完全合理的。
  • @wflynny 你认为我应该使用 xbee 模块中的TimeOutException,而不是使用我自己的带有TimedOutError 的警报来解决阅读时不阻塞的问题吗?跨度>

标签: python try-catch


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2017-11-03
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多