异常处理

程序运行时难免出错:传感器没接好、文件不存在、网络断开……
异常处理就是给程序穿上"安全气囊",出错时不崩溃,而是优雅地处理。


try-except 捕获异常

try:
    x = 10 / 0              # 除以零,会抛出 ZeroDivisionError
except:
    print('出错了!')        # 捕获到异常,执行这里

捕获特定异常类型

try:
    num = int('abc')         # 字符串转整数失败,抛出 ValueError
except ValueError:
    print('不是有效的数字')
except ZeroDivisionError:
    print('不能除以零')

获取异常信息

try:
    num = int('hello')
except ValueError as e:
    print('错误详情:', e)     # 输出:invalid literal for int() with base 10: 'hello'

try-except-else 完整结构

try:
    result = 10 / 2
except ZeroDivisionError:
    print('除零错误')
else:
    print('计算成功,结果是', result)  # 没出错才执行

try-except-finally 无论成败都执行

try:
    f = open('data.txt', 'r')
    content = f.read()
except FileNotFoundError:
    print('文件不存在')
finally:
    print('清理工作完成')      # 无论是否异常,都会执行
    # 常用于关闭文件、释放资源

主动抛出异常 raise

def set_age(age):
    if age < 0:
        raise ValueError('年龄不能为负数')
    return age

try:
    set_age(-5)
except ValueError as e:
    print(e)                  # 输出:年龄不能为负数

常见异常类型速查

异常名 触发场景
ValueError 值不正确,如 int('abc')
TypeError 类型错误,如 '1' + 1
ZeroDivisionError 除以零
IndexError 列表索引越界
KeyError 字典键不存在
FileNotFoundError 文件不存在
ImportError 模块导入失败
NameError 变量未定义

实际应用:读取传感器

from machine import ADC, Pin
import time

adc = ADC(Pin(26))

def read_sensor():
    try:
        value = adc.read_u16()
        if value < 0 or value > 65535:
            raise ValueError('ADC读数异常')
        return value
    except ValueError as e:
        print('传感器错误:', e)
        return None
    finally:
        pass  # 可在此处添加传感器复位等清理操作

# 使用
for i in range(5):
    result = read_sensor()
    if result is not None:
        print('读数:', result)
    time.sleep(1)

注意事项

  • 不要用空的 except: 吞掉所有错误,会隐藏真正的问题
  • 异常处理不是万能的,能提前判断的尽量用 if 预防
  • finally 块常用于释放资源(关闭文件、断开连接等)