如果你是初学编程你可能会问,什么是异常?异常(Exception) 是指程序在运行过程中遇到的非正常情况或错误,这些情况会中断程序的正常执行流程。我们不能把异常和错误搞混淆异常(Exception) = “意料之外但能处理的小状况”
- 顾客下单时填错了手机号(程序里就是输入格式不对 → ValueError)
- 你想从仓库拿一件商品,但那件刚好卖完了(相当于文件找不
这就是“异常”:问题不大,程序可以“兜住”,继续运行。错误(Error) = “大事不妙,没法正常继续了”
- 店铺突然停电了(相当于系统崩溃、内存爆了 →
MemoryError) - 你决定今天关门不干了,直接拉闸(程序里调用了
sys.exit() → SystemExit)
- 你自己按了紧急停止按钮(比如在终端按 Ctrl+C → KeyboardInterrupt)
所以异常(Exception)不完全等于错误(Error)异常是程序运行时的错误信号。Python 的异常机制让程序更健壮、可维护。异常机制已经成为判断一门编程语言是否成熟的标准,主流的语言都提供了成熟的异常机制。python的异常机制主要依赖try、except、else、finally和raise五个关键字。接下来我们具体看看怎么做? try:#写一个 try 把可能出错的代码放进去。# 写一个except,as e代表储存异常的基本信息 except (Error1,Error2) as e:- 执行try块里的代码段出现异常,系统自动生成一个异常对象,该异常对象被提交给Python解释器,这个过程被称为引发异常。
- 解释器收到异常对象时,会寻找能处理该异常对象的except块,如果找到合适的except块,则把该异常对象交给该except块处理,这个过程被称为捕获异常。
多异常捕获的另外一种写法:
- with_traceback():通过该方法可以处理异常的传播轨迹信息。
- 异常处理语法结构中,只有try块是必需的,它里面放置的是可能引发异常的代码。如果没有try块,则不能有后面的except块和finally块;
- 在except后对应的是异常类型和一个代码块,用于表明该except块处理这种类型的代码块;
- else块表明程序不出现异常时还要执行else块;
- finally块必须位于所有的except块之后;用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。
- except块和finally块都是可选的,但except块和finally块至少出现其中之一,也可以同时出现;多个except块必须位于try块之后;
现在来讲讲考纲里面不考,但是平时写程序必须用的raiseraise 就是 “手动抛出一个异常”,相当于你主动说:“这里有问题,停下!”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("清理完成:资源释放或日志记录")
大家可以分析一下这个程序的执行情况和顺序。今天就分享到这里。欢迎大家指正沟通交流!