捕获导入模块中引发的异常

Catching exceptions raised in imported modules

我正在编写一个使用 pyserial 模块的 Python 程序。该程序旨在读取 Arduino 模块的输出。我可以打开一个串行对象:

ser = serial.Serial('/dev/cu.usbmodem641', 9600)

然后我可以通过以下方式读取它:

line = ser.readline()

但是,我希望能够处理在没有连接 Arduino 模块的情况下启动程序时抛出的异常。抛出的异常是:

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/serial/serialposix.py", line 292, in open
raise SerialException(msg.errno, "could not open port %s: %s" % (self._port, msg))

如果我尝试在我的主程序中使用通用 try/except 块来捕捉它,它不会被捕捉到。我试过从 serialposix.py 导入 SerialException 但这不起作用。

我是否需要亲自动手处理线程,或者是否有其他处理方法?当抛出异常时,我想调用 time.sleep(5) 然后重试直到连接可用。

您可以导入 serial.SerialException 并捕获:

from serial import SerialException

try:
    line = ser.readline()
except SerialException:
    time.sleep(5)

该异常是 IOError 的子类,因此您也可以使用它,但是您可能会捕获由于端口尚不可用以外的原因抛出的异常。