1、异常概念

定义:程序在运行过程当中,不可避免的会出现一些错误,可能经常看到的报错信息,例如:NameErrorTypeErrorValueError等,这些都是异常。

程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行。所以当Python程序发生异常时,我们需要捕获并处理异常,否则程序就会终止执行,影响程序的正常执行。

2、了解异常

当检测到一个错误时,解释器就无法继续执行了,会出现一些错误的提示到控制台,这就是所谓的"异常"。

例如:以r方式打开一个不存在的文件,就会抛出异常,我们在控制台中就能够看到。

open('test.txt', 'r')

像上面这种情况,我们在编写代码的时候,我们不确定一个语句是否一定会正确执行,这个时候就可以把这句可能出现的问题的代码,放入到异常语句中。

因为异常语句会尝试执行一行或一段可能发生错误的代码,万一发生错误可以执行另外一行或一段一定可以执行的代码,从而替代有错误的代码。以达到让程序不报错,可以继续向下执行程序。

总结:

Python程序运行时出现异常,目的并不是让我们的程序直接终止。

而是Python是希望在出现异常时,我们可以编写代码来对异常进行处理。

3、异常的写法

(1)语法

try:
可能发生错误的代码
except:
如果出现异常执行的代码(出现错误以后的处理方式)

(2)快速体验

需求:尝试以r模式打开文件,如果文件不存在,则以w方式打开。

try:
f = open('test.txt', 'r')
except:
f = open('test.txt', 'w')

(3)捕获指定异常

1)语法

try:
可能发生错误的代码
except 异常类型:
如果捕获到该异常类型执行的代码

说明:如果我们执行的代码有错误,且错误类型和except指定的异常类型一致,则执行匹配类型异常下定义的代码。

总结:

  • 如果except后不跟任何的内容,则此时它会捕获到所有的异常。
  • 如果在except后跟着一个异常的类型,那么此时它只会捕获该类型的异常。

2)体验

"""
需求:尝试执行打印num,捕获异常类型NameError,
如果捕获到这个异常类型,执行打印:你的变量没有被定义
"""
# 结果:你的变量没有被定义
try:
print(num)
except NameError:
print('你的变量没有被定义')

注意:

  1. 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
  2. 一般try下方只放一行尝试执行的代码。

3)捕获多个指定异常。

有时候我们编写代码的时候,并不确定一行代码可能抛出哪种异常类型,可能就会多写几种异常类型。

当捕获多个异常时,可以把要捕获的异常类型的名字,统一放到except后,并使用元组的方式进行书写。

try:
print(1/0)
except (NameError, ZeroDivisionError):
print('有错误')

只要尝试执行的异常代码,所抛出来的异常类型,和except后定义在元组中的任一异常类型相匹配,都能被捕获到。

不同类型的异常类型也可以分开写,如下:

try:
print(10/0)
except NameError:
print('出现 NameError 异常')
except ZeroDivisionError:
print('出现 ZeroDivisionError 异常')
except IndexError:
print('出现 IndexError 异常')

4)何为异常类型何为异常描述信息。

在控制台查看的异常信息中,如NameError: name 'num' is not defined

冒号前NameError,显示的就是异常类型。

冒号后name 'num' is not defined,显示的就是异常描述信息。

5)捕获异常描述信息。

try:
print(num)
except (NameError, ZeroDivisionError) as result:
print(result) # 或者
try:
print(10/0)
except NameError as e:
print('异常类型',e)
except ZeroDivisionError as e:
print('异常类型',e)
except IndexError as e:
print('异常类型',e)

as是一个关键字,as关键字后的变量就是捕获到的异常的描述信息,变量名是可以自定义的。

6)捕获所有异常。

Exception是所有程序异常类的父类,所以如果except后跟的是Exception,也会捕获到所有的异常。

# 1.捕获所有异常
try:
print(num)
except Exception:
print("捕获异常了") # 或者不写Exception
try:
print(num)
except:
print("捕获异常了") # 2.捕获所有异常信息
try:
print(num)
except Exception as result:
print(result)

(4)异常中的else

else表示的是如果没有异常要执行的代码。

try:
print(1)
except Exception as result:
print(result)
else:
print('我是else,是没有异常的时候执行的代码')

(5)异常中的finally

finally表示的是,无论是否异常都要执行的代码。也就是说,不管前边代码是否正确执行,都必须只要执行的代码,就写在finally中。例如关闭文件。

try:
f = open('test.txt', 'r')
except Exception as result:
f = open('test.txt', 'w')
else:
print('没有异常,真开心')
finally:
# 一般用于关闭所有打开的资源
f.close()

(6)总结

异常处理的完整结构,如下所示:

try语句
try:
代码块(可能出现错误的语句)
except 异常类型 as 异常名:
代码块(出现错误以后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误以后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误以后的处理方式)
else:
代码块(没出错时要执行的语句)
finally:
代码块(该代码块总会执行)

说明:

  • try是必须写的,可以将可能出错的代码放入到try语句中,这样如果代码没有错误,则会正常执行。如果出现错误,则会执行expect子句中的代码,这样我们就可以通过代码来处理异常, 避免因为一个异常导致整个程序的终止 。
  • else语句有没有都行。
  • exceptfinally至少有一个 。

『无为则无心』Python函数 — 38、Python中的异常的更多相关文章

  1. 『无为则无心』Python函数 — 25、Python中的函数

    目录 1.函数的使用 (1)定义函数 (2)调用函数 (3)使用函数的注意事项 2.函数的参数 3.实参的类型 Python函数的说明: Python中函数的应用非常广泛,前面章节中我们已经接触过多个 ...

  2. 『无为则无心』Python函数 — 26、Python函数参数的传递方式

    目录 1.位置参数 2.关键字参数 3.缺省参数(默认参数) 4.不定长参数(可变参数) (1)包裹位置传递 (2)包裹关键字传递 5.位置参数.默认参数.可变参数的混合使用 6.拓展:参数解包 提示 ...

  3. 『无为则无心』Python函数 — 28、Python函数的简单应用

    目录 1.函数嵌套调用 2.Python函数的简单应用 (1)打印线条 (2)函数计算 (3)打印图形 3.函数的说明文档 (1)函数的说明文档的作用 (2)函数说明文档的语法 (3)查看函数的说明文 ...

  4. 『无为则无心』Python函数 — 29、Python变量和参数传递

    目录 1.Python的变量 (1)Python变量不能独立存在 (2)变量是内存中数据的引用 (3)注意点 2.了解变量的引用 3.Python的参数传递(重点) (1)示例 (2)结论 (3)总结 ...

  5. 『无为则无心』Python函数 — 33、高阶函数

    目录 1.高阶函数的定义 2.体验高阶函数 3.内置高阶函数 (1)map()函数 (2)reduce()函数 (3)filter()函数 1.高阶函数的定义 把函数作为参数传入(把一个函数作为另外一 ...

  6. 『无为则无心』Python函数 — 39、Python中异常的传播

    目录 1.异常的传播 2.如何处理异常 1.异常的传播 当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播.如果函数中没有对异常进行处理,则异常会继续向函数调用者传播.如果函数调 ...

  7. 『无为则无心』Python基础 — 4、Python代码常用调试工具

    目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...

  8. 『无为则无心』Python基础 — 6、Python的注释

    目录 1.注释的作用 2.注释的分类 单行注释 多行注释 3.注释的注意事项 4.什么时候需要使用注释 5.总结 提示:完成了前面的准备工作,之后的文章开始介绍Python的基本语法了. Python ...

  9. 『无为则无心』Python基础 — 7、Python的变量

    目录 1.变量的定义 2.Python变量说明 3.Python中定义变量 (1)定义语法 (2)标识符定义规则 (3)内置关键字 (4)标识符命名习惯 4.使用变量 1.变量的定义 程序中,数据都是 ...

  10. 『无为则无心』Python基础 — 9、Python字符串的编码与转义

    目录 1.查看变量类型 2.转义字符 (1)转义字符说明 (2)示例 (3)常用转义字符对照表 3.字符编码 (1)字符编码介绍 (2)Python中的字符编码 (3)编码格式应用于不同场景 提示:上 ...

随机推荐

  1. 【LeetCode】1022. Sum of Root To Leaf Binary Numbers 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetco ...

  2. Spring Boot实战三:集成RabbitMQ,实现消息确认

    Spring Boot集成RabbitMQ相比于Spring集成RabbitMQ简单很多,有兴趣了解Spring集成RabbitMQ的同学可以看我之前的<RabbitMQ学习笔记>系列的博 ...

  3. Simplicial principal component analysis for density functions in Bayes spaces

    目录 问题 上的PCA Hron K, Menafoglio A, Templ M, et al. Simplicial principal component analysis for densit ...

  4. CS5268替代AG9321MCQ 替代AG9321方案 TYPEC转HDMI多功能拓展坞

    台湾安格AG9321MCQ是一款TYPEC拓展坞产品方案,他集中了TYPEC 转HDMI  VGA  PD3.0快充  QC3.0数据传输 I2S接口的音频DAC输出以及可以各种读卡器功能. Caps ...

  5. 《MySQL数据操作与查询》- 综合项目 - 航空售票系统

    Mysql & SqlServer综合项目需求 1.系统整体功能 系统需支持以下功能: 维护客户信息.航班信息和票务信息 支持客户按多种条件组合查询航班信息和票务信息 支持客户根据票务信息订购 ...

  6. Java网络编程Demo,使用TCP 实现简单群聊功能Groupchat,创建一个服务端,使多个客户端都能收到消息

    效果图: 开启服务端 客户端一 客户端二 客户端三 实现代码: 客户端类 import java.io.IOException; import java.net.ServerSocket; impor ...

  7. Windows下安装配置jdk

    1.jdk安装 从官网获取jdk安装包后, 双击图形化安装,一路next即可. 2.配置JavaHome 打开计算机->系统属性->高级系统设置->环境变量 在系统变量下面添JAVA ...

  8. Swoole 中使用 Context 类管理上下文,防止发生数据错乱

    前面的文章中,我们说过:不能使用类静态变量 Class::$array / 全局变量 global $_array / 全局对象属性 $object->array / 其他超全局变量 $GLOB ...

  9. MySQL存储过程入门基础

    创建存储过程无参语法: delimiter // create procedure 函数名() begin 业务逻辑 end // call 函数名() 通过函数名调用存储过程 创建存储过程有参与法: ...

  10. python+pytest,通过自定义命令行参数,实现浏览器兼容性跑用例

    场景拓展: UI自动化可能需要指定浏览器进行测试,为了做成自定义配置浏览器,可以通过动态添加pytest的命令行参数,在执行的时候,获取命令行传入的参数,在对应的浏览器执行用例. 1.自动化用例需要支 ...