程序运行时难免出错:传感器没接好、文件不存在、网络断开……
异常处理就是给程序穿上"安全气囊",出错时不崩溃,而是优雅地处理。
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:
result = 10 / 2
except ZeroDivisionError:
print('除零错误')
else:
print('计算成功,结果是', result) # 没出错才执行
try:
f = open('data.txt', 'r')
content = f.read()
except FileNotFoundError:
print('文件不存在')
finally:
print('清理工作完成') # 无论是否异常,都会执行
# 常用于关闭文件、释放资源
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: 吞掉所有错误,会隐藏真正的问题