目标:清楚什么是错误与异常;能够根据异常定位问题;掌握异常处理方式

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 执行:

执行顺序(超级重要)

  1. 先执行 TestContext() 创建对象
  2. 自动调用 __enter__()打印:call __enter__
  3. __enter__() 返回了 self→ 赋值给 tc
  4. 执行缩进内的代码 print(tc)
  5. 退出缩进,自动调用 __exit__()打印:call __exit__

Logo

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

更多推荐