当前位置:首页>python>第二十八课:Python中的异常处理

第二十八课:Python中的异常处理

  • 2026-10-21 13:28:50
第二十八课:Python中的异常处理
如果你是初学编程你可能会问,什么是异常?异常(Exception) 是指程序在运行过程中遇到的非正常情况或错误,这些情况会中断程序的正常执行流程。我们不能把异常和错误搞混淆

异常(Exception) = “意料之外但能处理的小状况”

比如:
  • 顾客下单时填错了手机号(程序里就是输入格式不对 → ValueError)
  • 你想从仓库拿一件商品,但那件刚好卖完了(相当于文件找不
    到 → FileNotFoundError)
  • 顾客付款时网络卡了一下(可能是连接超时)
这些都不是世界末日!你可以:
  • 提示顾客“手机号格式不对,请重填”
  • 显示“该商品暂时缺货”
  • 让用户“点击重试”
这就是“异常”:问题不大,程序可以“兜住”,继续运行。

错误(Error) = “大事不妙,没法正常继续了”

比如:
  • 店铺突然停电了(相当于系统崩溃、内存爆了 → MemoryError)
  • 你决定今天关门不干了,直接拉闸(程序里调用了 sys.exit() → SystemExit)
  • 你自己按了紧急停止按钮(比如在终端按 Ctrl+C → KeyboardInterrupt)
这些情况:
  • 不是顾客或流程的问题
  • 是系统级、环境级的大事
  • 通常不该强行“继续营业”,而是安全收摊
所以异常(Exception)不完全等于错误(Error)异常是程序运行时的错误信号。Python 的异常机制让程序更健壮、可维护。
异常机制已经成为判断一门编程语言是否成熟的标准,主流的语言都提供了成熟的异常机制。
python的异常机制主要依赖try、except、else、finally和raise五个关键字。接下来我们具体看看怎么做?
1、使用try……except捕获异常
语法结构:
        try:#写一个 try 把可能出错的代码放进去。
            代码段
# 写一个except,as e代表储存异常的基本信息
        except (Error1,Error2) as e:
                获取到异常时的处理   # 书写捕获异常的处理方案
举例说明:
解释执行流程:
  1. 执行try块里的代码段出现异常,系统自动生成一个异常对象,该异常对象被提交给Python解释器,这个过程被称为引发异常。
  2. 解释器收到异常对象时,会寻找能处理该异常对象的except块,如果找到合适的except块,则把该异常对象交给该except块处理,这个过程被称为捕获异常。
  3. 捕获不到异常except块,则运行时环境终止。

多异常捕获的另外一种写法:

2、访问异常信息
  1. args:该属性返回异常的错误编号和描述字符串。
  2. errno:该属性返回异常的错误编号。
  3. strerror:该属性返回异常的描述字符串。
  4. with_traceback():通过该方法可以处理异常的传播轨迹信息。
举例:
3、else块
在没有出现异常时,执行的语句块
4、使用finally回收资源
特点:finally块总会被执行
  • 异常处理语法结构中,只有try块是必需的,它里面放置的是可能引发异常的代码。如果没有try块,则不能有后面的except块和finally块;
  • 在except后对应的是异常类型和一个代码块,用于表明该except块处理这种类型的代码块;
  • else块表明程序不出现异常时还要执行else块;
  • finally块必须位于所有的except块之后;用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。
  • except块和finally块都是可选的,但except块和finally块至少出现其中之一,也可以同时出现;多个except块必须位于try块之后;
现在来讲讲考纲里面不考,但是平时写程序必须用的raise
raise 就是 “手动抛出一个异常”,相当于你主动说:“这里有问题,停下!”
例子:阻止无效输入
def sqrt(x):    if x < 0:        raise ValueError("不能计算负数的平方根")    return x ** 0.5# 调用print(sqrt(-4))
ValueError: 不能计算负数的平方根;程序不会继续算 (-4)**0.5,而是在你指定的地方立刻报错。

什么是异常链?

当你在处理一个异常时,又引发了另一个异常,Python 会自动把这两个异常“串起来”,形成一条异常链。

Python 用 raise ... from ... 语法显式建立这种链。
try:    open('不存在的文件.txt')except FileNotFoundError as e:    raise RuntimeError("无法加载配置文件") from e
报出异常:
  • 最开始是 文件找不到(原始错误)
  • 然后程序主动抛出一个更上层的错误:“配置加载失败”
  • 用 from e 把它们连起来,说明:后者是由前者直接引起的
今天最后来一个综合的例子:
try:    f = open('config.txt')except FileNotFoundError as e:    # 捕获底层异常,抛出带上下文的上层异常(显式异常链)    raise RuntimeError("应用启动失败:配置文件缺失") from eelse:    # 只有在 try 块**没有发生任何异常**时才执行    print("配置文件加载成功")    f.close()finally:    # 无论有没有异常,**一定会执行**    print("清理完成:资源释放或日志记录")
大家可以分析一下这个程序的执行情况和顺序。今天就分享到这里。欢迎大家指正沟通交流!

最新文章

随机文章