Python异常处理入门:try/except与常见错误排查
【摘要】 程序难免出错:用户输入了字母却要求做除法,文件路径写错了打不开,网络请求超时断了连接。Python 把运行时的错误统一建模为「异常」(Exception),并提供 try/except 机制让我们优雅地处理它们。掌握异常处理,是从"能写代码"到"能写可靠代码"的关键一步。 一、try/except 基本写法try: num = int(input("请输入一个整数:")) pri...
程序难免出错:用户输入了字母却要求做除法,文件路径写错了打不开,网络请求超时断了连接。Python 把运行时的错误统一建模为「异常」(Exception),并提供 try/except 机制让我们优雅地处理它们。掌握异常处理,是从"能写代码"到"能写可靠代码"的关键一步。
一、try/except 基本写法
try:
num = int(input("请输入一个整数:"))
print("10 除以它等于:", 10 / num)
except ValueError:
print("输入的不是整数,请重新输入")
except ZeroDivisionError:
print("除数不能为 0")
执行流程很直观:先跑 try 里面的代码;如果抛出了 ValueError,就跳到对应的 except 分支;没有异常则跳过所有 except。这样程序不会因为一次错误输入就直接崩溃。
二、捕获多个异常的三种姿势
- 并列写多个 except(推荐,语义最清晰);
- 用元组一次捕获多种:
except (ValueError, TypeError) as e:; - 用 Exception 兜底——但要放在最后,因为 except 按顺序匹配:
try:
data = load_data()
except FileNotFoundError:
print("文件不存在")
except Exception as e: # 兜底必须放最后
print("发生未知错误:", e)
注意:永远不要写裸 except:(不带异常类型)。它会连 KeyboardInterrupt、SystemExit 一起吞掉,让程序无法正常退出,调试时更是噩梦。
三、else 与 finally:完整的异常处理拼图
try:
f = open("data.txt", encoding="utf-8")
content = f.read()
except FileNotFoundError:
print("文件不存在")
else:
print("读取成功,共", len(content), "个字符")
finally:
f.close()
- else:try 没抛异常时执行,适合放"成功后才做的事",让 try 块保持精简;
- finally:无论是否异常都会执行,适合释放资源(关文件、关连接)。
更 Pythonic 的做法是用 with 语句自动管理资源,连 finally 都省了:
with open("data.txt", encoding="utf-8") as f:
content = f.read() # 离开 with 块自动关闭文件
四、raise:主动抛出异常
校验参数时,与其返回 None 让调用方猜,不如直接抛出有意义的异常:
def divide(a, b):
if b == 0:
raise ValueError("除数 b 不能为 0")
return a / b
也可以自定义异常类型,让错误语义更精确:
class ConfigError(Exception):
"""配置文件相关错误的基类"""
pass
raise ConfigError("config.yaml 缺少必填项 database.host")
五、常见错误排查速查
| 报错 | 常见原因 | 排查方向 |
|---|---|---|
| NameError | 变量名拼错、先用后定义 | 检查拼写与作用域 |
| TypeError | 类型不匹配,如 “1” + 2 | 打印 type() 确认类型 |
| ValueError | 值非法,如 int(“abc”) | 检查输入数据合法性 |
| IndexError | 列表越界 | 检查 len() 与下标 |
| KeyError | 字典缺少 key | 用 in 判断或 .get() 兜底 |
| AttributeError | 对象没有该属性/方法 | 检查对象类型与拼写 |
| IndentationError | 缩进混乱 | 统一 4 空格,不混用 Tab |
| ModuleNotFoundError | 模块未安装或路径不对 | pip list 检查,确认虚拟环境 |
六、排查错误的三个习惯
- 从下往上读 Traceback:最后一行是真正的错误类型和位置,上面是调用栈;
- 加日志而不是删代码:用 logging 记录关键变量,比 print 更适合长期排查;
- 最小复现:把报错代码抽成 10 行以内的独立脚本,能复现就成功了一半。
小结
try/except 负责"接住"异常,else/finally 负责"善后",raise 负责"主动报错",with 负责"自动释放资源"。记住两条铁律:捕获要具体、不要写裸 except;资源释放优先用 with。把这套组合用熟练,你的 Python 程序会稳得多。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)