Python异常处理入门:try/except与常见错误排查

举报
yd_294192959 发表于 2026/11/03 09:03:27 2026/11/03
【摘要】 程序难免出错:用户输入了字母却要求做除法,文件路径写错了打不开,网络请求超时断了连接。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。这样程序不会因为一次错误输入就直接崩溃。

二、捕获多个异常的三种姿势

  1. 并列写多个 except(推荐,语义最清晰);
  2. 用元组一次捕获多种:except (ValueError, TypeError) as e:;
  3. 用 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 检查,确认虚拟环境

六、排查错误的三个习惯

  1. 从下往上读 Traceback:最后一行是真正的错误类型和位置,上面是调用栈;
  2. 加日志而不是删代码:用 logging 记录关键变量,比 print 更适合长期排查;
  3. 最小复现:把报错代码抽成 10 行以内的独立脚本,能复现就成功了一半。

小结

try/except 负责"接住"异常,else/finally 负责"善后",raise 负责"主动报错",with 负责"自动释放资源"。记住两条铁律:捕获要具体、不要写裸 except;资源释放优先用 with。把这套组合用熟练,你的 Python 程序会稳得多。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。