代码之家  ›  专栏  ›  技术社区  ›  CheezGuy

Python尝试/不停止错误除外

  •  -1
  • CheezGuy  · 技术社区  · 1 年前

    我下面的代码是为了处理异常并在没有发现任何异常的情况下切换串行端口而设计的。

    try:
        serial_port = '/dev/cu.usbserial-10'
    except:
        try: 
            serial_port = '/dev/cu.usbserial-110'
        except:
            print("Unable to find sensor. Try again")
    

    然而,它实际上并没有处理异常,仍然可以让它们进入控制台:

    Traceback (most recent call last):
      File "/Users/username/Library/Python/3.10/lib/python/site-packages/serial/serialposix.py", line 322, in open
        self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
    FileNotFoundError: [Errno 2] No such file or directory: '/dev/cu.usbserial-10'
    

    我已经在代码中设置了它,这样如果没有 /dev/cu.usbserial-10 ,它尝试 serial-110 ,如果没有,它会打印一些东西,但永远不会打印。

    编辑

    我正在使用pyserial,因此 serial_port 分配尝试查找文件位置。 '/dev/cu.usbserial-10' 是我电脑上的一个USB端口。

    错误确实显示在第322行,但我的文件不是>100行长。

    更多上下文:

    import serial
    
    serial_port = 0
    
    try:
        serial_port = '/dev/cu.usbserial-10'
    except:
        try:
            serial_port = '/dev/cu.usbserial-110'
        except:
            print("no")
    
    
    baud_rate = 115200
    
    ser = serial.Serial(serial_port, baud_rate) # serial data, non-usable
    
    try:
        while True:
            rawdata = ser.readline().decode().strip() # raw string data from serial
            print(rawdata)
    

    这是我的整个文件,当 usbserial-10 找到了,它确实有效。

    2 回复  |  直到 1 年前
        1
  •  0
  •   Avijit Bhuin    1 年前

    根据发布的代码,您正试图执行某种函数,根据指定的文本打开串行端口。

    try:
    serial_port = '/dev/cu.usbserial-10' 
        #you're only assigning the value to a variable . you actually need to call the function that youre testing with that variable here
    except:
        try: 
            serial_port = '/dev/cu.usbserial-110'
        except:
            print("Unable to find sensor. Try again")
    

    这是一个示例代码:

    try:
    serial_port = '/dev/cu.usbserial-10'
    response=open_serial_port(serial_port) #assuming 'open_serial_port' is the function name.
    except:
        try: 
            serial_port = '/dev/cu.usbserial-110'
            response=open_serial_port(serial_port) #assuming 'open_serial_port' is the function name.
        except:
            print("Unable to find sensor. Try again")
    

    这是一个如何修复它的例子。

    以下是您提供的更新代码:

    import serial
    
    serial_port = 0
    baud_rate = 115200
    
    try:
        serial_port = '/dev/cu.usbserial-10'
        ser = serial.Serial(serial_port, baud_rate) # serial data, non-usable
    except:
        try:
            serial_port = '/dev/cu.usbserial-110'
            ser = serial.Serial(serial_port, baud_rate) # serial data, non-usable
        except:
            print("no")
    
    try:
        while True:
            rawdata = ser.readline().decode().strip() # raw string data from serial
            print(rawdata)
    
    except:
        pass
    
        2
  •  0
  •   ShadowRanger    1 年前

    你没有把端口的开口包起来 try / except ,这就是错误所在。字符串赋值基本上是绝对正确的,不会出现任何异常。实现目标的惯用方法是替换:

    import serial
    
    serial_port = 0
    
    try:
        serial_port = '/dev/cu.usbserial-10'
    except:
        try:
            serial_port = '/dev/cu.usbserial-110'
        except:
            print("no")
    
    
    baud_rate = 115200
    
    ser = serial.Serial(serial_port, baud_rate) # serial data, non-usable
    

    具有

    import serial
    import sys
    
    baud_rate = 115200
    
    # Loop over possible ports until we open one successfully, or all fail
    for serial_port in ('/dev/cu.usbserial-10', '/dev/cu.usbserial-110'):
        try:
            ser = serial.Serial(serial_port, baud_rate)
            break  # If opening the serial port succeeded, we're done, move on to using it
        except OSError as e:
            print(f"Failed to open {serial_port!r}", file=sys.stderr)
    else:
        sys.exit(f"Couldn't not open any serial ports, exiting...")
    
    try:
        while True:
            rawdata = ser.readline().decode().strip() # raw string data from serial
            print(rawdata)
    except OSError:
        # Handle errors as desired