我不明白为什么有时候在我的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
TimeoutException
吗? - wflynnyTimeOutError
,但是在代码中我只看到了TimedOutError
(有一个 d)。最初,问题的写法不清楚异常定义在哪里——合理地假设你做了类似于from xbee import *
的事情。 - wflynnyTimeOutException
而不是使用自己的带有TimedOutError
的警报来解决非阻塞读取问题吗? - LPSsignal_handler
在一个不同的线程中运行,而不是你的try..catch
块。我对serial
不熟悉,所以这可能完全错误,但未捕获异常和你发布的回溯信息一致支持这个理论。 - J0HN