当前位置:首页>python>为什么你的 Python 代码老报错?原来是没懂错误处理

为什么你的 Python 代码老报错?原来是没懂错误处理

  • 2026-10-11 08:25:20
为什么你的 Python 代码老报错?原来是没懂错误处理

点击上方蓝字关注我们

hello,大家好呀!我是星禾 🌟
我之前当程序员那会儿,最怕的就是线上出bug。特别是那种偶发性bug,你本地怎么测都OK,一上线就崩,那种感觉真的太酸爽了...
当然经历的多了也就明白了,很多时候我们并不能阻止“错误”,更多的是预防“崩溃”,这其中最关键的就在于——错误处理。
接下来我们就来聊聊Python里的错误处理,保证你听完就能用!

01

为什么你的代码总是崩溃?
先问大家一个问题:下面这段代码会输出什么?
age = input("请输入你的年龄:")
print(f"明年你就{age + 1}岁了")
聪明的小伙伴可能已经发现了——
input()
返回的是字符串,字符串不能直接和整数相加!所以运行时会报错:
`TypeError: can only concatenate str (not "int") to str`
这种运行时出现的"错误",在Python里叫做异常(Exception)。
常见的异常包括:
  • :值不合法,比如
ValueError
int("abc")
  • :列表索引超出范围
IndexError
  • :字典里没有这个键
KeyError
  • :文件不存在
FileNotFoundError
  • :除数为零
ZeroDivisionError
那怎么让程序在遇到这些错误时不会直接挂掉呢?

02

try...except:捕获异常的正确姿势
Python给我们提供了一个超级好用的语法——
try...except
基础用法
try:
    # 可能出错的代码写在这里
    result = 10 / 0
except ZeroDivisionError:
    # 如果出了这个错,就执行这里的代码
    print("除数不能为零!")
运行一下:
除数不能为零!
程序没有崩溃,而是优雅地处理了错误!
捕获多种异常
有时候我们不确定会出哪种错,可以捕获多种:
try:
    num = int(input("请输入一个数字:"))
    result = 10 / num
except ValueError:
    print("输入的不是有效数字!")
except ZeroDivisionError:
    print("除数不能为零!")
获取异常信息
如果想知道到底出了什么错,可以这样:
try:
    1 / 0
except Exception as e:
    print(f"错误类型:{type(e).__name__}")
    print(f"错误信息:{e}")
输出:
错误类型:ZeroDivisionError
错误信息:division by zero

03

else和finally:让代码更完整
还有两个可选的"小助手":
try...except
try:
    result = 10 / 2
except ZeroDivisionError:
    print("除数不能为零")
else:
    # 只有在没有异常时才会执行
    print(f"计算成功,结果是 {result}")
finally:
    # 无论有没有异常,都会执行
    print("程序结束")
输出:
计算成功,结果是 5.0
程序结束
它们什么时候用?
  • :正常流程需要执行的代码,比如处理计算结果
else
  • :清理工作,比如关闭文件、断开数据库连接
finally

04

raise:主动抛出异常
有时候我们不只是"捕获"错误,还要主动"抛出"错误。
比如做一个取钱函数:
def withdraw(balance, amount):
    if amount > balance:
        raise ValueError("余额不足!")
    return balance - amount

try:
    new_balance = withdraw(100, 200)
except ValueError as e:
    print(e)  # 输出:余额不足!
这样可以让代码逻辑更清晰,把"检查"和"处理"分开。

05

自定义异常:让你的代码更专业
Python允许我们创建自己的异常类型:
class AgeError(ValueError):
    """年龄相关的异常"""
    pass

def set_age(age):
    if age < 0 or age > 150:
        raise AgeError(f"无效的年龄:{age}")
    print(f"年龄设置为:{age}")

try:
    set_age(200)
except AgeError as e:
    print(f"设置失败:{e}")
这样做有什么好处?
  1. 代码语义更清晰
  2. 方便统一处理特定类型的错误
  3. 其他模块也能复用你的异常类型

06

最佳实践与避坑指南
✅ 推荐这样做
# 1. 尽量具体捕获异常
try:
    with open("data.txt", "r") as f:
        content = f.read()
except FileNotFoundError:
    print("文件不存在")
except PermissionError:
    print("没有读取权限")

# 2. 使用with语句自动关闭资源
with open("test.txt", "w") as f:
    f.write("hello")

# 3. 记录日志而不是只打印
import logging
try:
    # 操作
except Exception as e:
    logging.error(f"发生错误:{e}")
❌ 千万别这样做
# 1. 不要用空的except块
try:
    risky_code()
except:
    pass  # 你都不知道出了什么错!

# 2. 不要过于宽泛地捕获
try:
    code()
except Exception:  # 捕获所有异常,太宽泛了
    pass

07

实战小练习
给大家留一个小练习:
写一个计算器函数,能处理:
  1. 用户输入非数字
  2. 除数为零
def safe_divide(a, b):
    # 在这里实现错误处理
    pass

# 测试
print(safe_divide(10, 2))   # 应该输出 5
print(safe_divide(10, 0))   # 应该输出 "除数不能为零"
print(safe_divide("a", 2))  # 应该输出 "请输入有效数字"
答案我放在评论区,大家可以先自己试试!

08

总结
概念
作用
try...except
捕获并处理异常
else
仅在无异常时执行
finally
无论是否有异常都执行
raise
主动抛出异常
自定义异常
定义特定业务异常类型
记住:错误处理不是为了"掩盖"问题,而是让程序在出错时能够安全、可控地应对。
掌握了今天的内容,下次遇到代码崩溃,你就知道该怎么优雅地处理了!
好啦,今天的内容就到这里啦~
如果觉得有用,欢迎转发给你身边正在学编程的朋友,大家一起进步!
你们平时写代码最常遇到什么类型的错误呢?欢迎在评论区留言,咱们一起讨论!
我是星禾,专注于分享AI和编程干货。
如果你恰好需要一些AI入门干货,可以来个“一键三连”(转发,必须动作)后评论区留言“AI入门工具清单”,并且后台私信“AI入门工具清单”获取。
我们下期见!

最新文章

随机文章