如果发生错误,请运行新代码

时间:2018-01-19 14:10:54

标签: python error-handling

这是我的代码:

for a in range (100):


        ser = serial.Serial(
            port = '/dev/ttyAMA0',
            baudrate = 38400,              #115200 is SMC-MRU, 9600
            parity = serial.PARITY_NONE,
            stopbits = serial.STOPBITS_ONE,
            bytesize = serial.EIGHTBITS,
            timeout = 1
        )
        counter = 0

        while 1:
            x = ser.readline(18)
            x2 = x.split(',')
            Yaxis = float(x2[1])
            Xaxis = float(x2[0])

有时我会收到InvalidLiteral错误。

为了纠正这个问题,我必须再次运行代码:

x = ser.readline()

取消它,然后将18放回括号中并且它有效。我想将其纳入脚本中,如何做到这一点就是我所要求的。

2 个答案:

答案 0 :(得分:0)

这样的东西?

for a in range (100):


    ser = serial.Serial(
        port = '/dev/ttyAMA0',
        baudrate = 38400,              #115200 is SMC-MRU, 9600
        parity = serial.PARITY_NONE,
        stopbits = serial.STOPBITS_ONE,
        bytesize = serial.EIGHTBITS,
        timeout = 1
    )
    counter = 0

    while 1:
        try:
            x = ser.readline(18)
        except ValueError:
            x = ser.readline()
        x2 = x.split(',')
        Yaxis = float(x2[1])
        Xaxis = float(x2[0])

答案 1 :(得分:0)

正如IMCoins所说,try / except是您正在寻找的解决方案。

首先,您可以捕获 InvalidLiteral 异常(它应该对应于 ValueError 类型,如所述here),然后相应地进行处理。这可以使用 except 指令作为后备:

while 1:
    try:
        x = ser.readline(18)
    except ValueError:
        x = ser.readline()
    x2 = x.split(',')
    Yaxis = float(x2[1])
    Xaxis = float(x2[0])

如果尝试中的代码失败并带有指定的异常类型,则将执行相应的块。注意:如果上面的代码成功,将不会执行。

最后,您还有 finally 指令,该指令始终在执行后执行,无论操作是成功还是失败。如你所说,你必须在没有参数的情况下调用它然后再试一次,你可能需要处理连接重置?我的想法是:

while 1:
    try:
        x = ser.readline(18)
    except ValueError:
        x = ser.readline()
        # handle the serial connection reset here if needed before retrying
        x = ser.readline(18)
    x2 = x.split(',')
    Yaxis = float(x2[1])
    Xaxis = float(x2[0])