python学习-xx9-2错误和异常
目标:清楚什么是错误与异常;能够根据异常定位问题;掌握异常处理方式
python代码转换为字节码,然后转换为cpu所认的二进制
错误发生在第一步的过程中,异常发生在第二步的运行过程中
1错误(编译的时候就会提示)
1.语法错误,Python解释器会进行提示

语法错误:不符合代码转换为字节的规定
编写错误:没有对齐等
2.逻辑错误,程序运行结果与预期不一致,需要自己排查
2异常(运行的时候会提示)
1.程序运行出错,Python解释器进行提示,定位代码位置进行修改

2.运行环境问题,例如:内存不足,网络错误等
1、常见异常

IndexError也叫越界问题
还有自己定义的一些异常
2、异常处理(出现了异常我们如何去解决这些异常)
①try...except(捕获指定异常,不让程序崩溃,让程序继续运行)
基本语法
try:异常捕获的入口,尝试执行后面缩进块里的代码
except Exception as e:捕获所有常规异常(Exception 是 Python 所有内置异常的父类),e 是异常对象,用来存错误信息(e可以打印用于查看错误原因)
输出了错误,并且跳过错误,执行了下面的代码

【⭐】这里就不能捕获,因为这是语法错误不是异常,为什么呢?在做1a=10的时候,代码还没有去运行,因为首先是要将python代码转换为字节码,然后转换为cpu所认的二进制,这个错误是发生在代码转化为字节码时的语法检查时。编译通过,并且去运行了,才会有异常捕获。
【⭐】Exception是所有常规异常的基类,使用Exception可以捕获所有常规异常
如果你要指定捕获的异常类型,但是实际发生的异常是另一种,这是不能捕获的,程序会报错

捕获多种异常
如果想要捕获多种的指定异常类型,语法如下:

例:
多个错误并存时,会错发第一个错误的捕获,try中的后续代码不执行

②try...finally(不管是否捕获异常,程序都会执行finally中的语句)
使用场景:释放资源等
基本语法
示例:无论是否触发异常,finally的部分都是要执行的
触发情况
触发异常,捕获了:先走except,再走finally

触发异常,没捕获:先走finally,再将异常抛给python解释器

没触发异常

3raise与assert语句(用于主动产生异常)
使用场景:
1.参数检查
例如:定义了一个函数,要求参数是列表,但是调用的时候传入的是字符串,这个时候就可以先对参数进行检查,如果传入的参数不对,可以主动去触发一个异常,提示传入参数出错
2.程序执行中逻辑错误,主动抛出异常
抛出的更多是自行定义的一些异常类,比如调用第三方的库,因为参数等等原因程序跑错了,会主动抛出异常告诉用户哪里出错了
Python 不会自动报错的地方,你主动用让它报错,或者把错误信息抛给上层调用者
如何抛出异常:👇
1、raise语句(检查程序异常,主动抛出异常)
基本语法
![]()
raise+异常类+(传入参数/想要说明)


2、assert语句(判断表达式结果是否为真,如果不为真,抛出AssertError异常)
基本语法
![]()
assert+异常表达式+抛出的异常语句

4自定义异常类(抛出自己想要关注的异常情况)

在自定义异常类的时候,一般都会去继承Exception
1、注意点:
1.必须继承Exception类
2.通过raise语句主动触发
2、示例(定义及抛出方式)

定义一个自定义异常类:class Net404Error(Exception):

构造函数(初始化错误信息):def __init__(self):

设置错误信息:args = ("访问连接不存在", "404")

调用父类构造方法:super().__init__(*args)

创建一个错误实例:net_error_404 = Net404Error()

抛出错误(程序崩溃):raise net_error_404


5with/as语句【⭐打开文件推荐用法】(操作上下文管理器,达到自动分配且释放资源目标)
上下文管理器(context manager)
1、应用
应用场景:打开/关闭文件
with 是 Python 用来自动 “开 / 关” 资源的语法

①基本语法
![]()
with:关键字,启动上下文管理器
- 作用:自动管理 “开始” 和 “结束”
- 不用你写 try/finally,它自动保证资源会被释放
context:一个支持上下文管理的对象(必须实现 __enter__ 和 __exit__)
最常见的例子:
- 文件对象
open('test.txt') - 数据库连接
- 锁
- 线程资源
- 网络连接
as var:把 context 对象返回的值赋值给变量 var(重命名)
- 你在代码块里用
var就能操作资源 - 不是必须写,但 99% 都会写
处理语句:
- 缩进里面的代码
- 在这个范围内使用资源
- 退出缩进 → 资源自动关闭 / 释放
②示例

可是看见f的状态是关闭的,那么为什么会关闭?上下文👇
2、上下文管理

会调用传入context对象的__exit__(),用于退出
所以传入的context对象必须支持上下文操作
3、自定义上下文类
看看上下文类的内部结构

定义一个上下文管理器类:class TestContext:
- 这是一个普通类
- 因为它实现了
__enter__和__exit__ - 所以它成为了 上下文管理器(Context Manager)
- 就能被
with使用
进入 with 时自动调用:
这是进入 with 代码块前自动执行的方法!
- 执行时机:刚进入
with立刻跑 - 作用:做初始化、准备资源
return self:把当前对象自己返回- 返回值 → 会交给
as tc
退出 with 时自动调用:
离开 with 代码块时自动执行,无论是否报错都会执行!
- 执行时机:退出缩进时
- 作用:自动关闭资源、清理、释放
- 三个参数是异常信息(这里没用到)

使用 with 执行:
执行顺序(超级重要)
- 先执行
TestContext()创建对象 - 自动调用
__enter__()打印:call __enter__ __enter__()返回了self→ 赋值给tc- 执行缩进内的代码
print(tc) - 退出缩进,自动调用
__exit__()打印:call __exit__


AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐





所有评论(0)