详解python的异常捕获
作者:侯小啾 发布时间:2023-05-27 11:24:03
①捕捉一个异常
捕捉一个异常
以用0作为除数会得到ZeroDivisionError异常为例,
print(1/0)
为例程序的持续执行,不因该异常而中止,
遂对该异常进行处理,使异常时输出该异常内容:
try:
print(1/0)
except ZeroDivisionError as e:
print(e)
②捕捉多个异常
捕捉指定的多个异常,以ZeroDivisionError和TypeError为例。
应用情景:
①可以用于捕捉指定的几种对我们程序需求有用的异常,产生这些异常时我们去执行相应的操作。
②指定几种不影响程序最终需求并可以忽略掉的异常。产生该异常时将其忽略,如果产生其他异常,则才是需要再进行调试处理的。
for i in range(2):
print(i)
try:
if i == 0:
print(1/0)
else:
print(1 + 'str')
except (ZeroDivisionError, TypeError) as e:
print(e)
③Exception捕捉所有异常
如果异常的种类不确定,则可以使用Exception来指代所有种类的异常。
以一个数值和一个字符串相加为例:
try:
print(1 + 'strstrstr')
except Exception as e:
print(e)
④raise主动触发异常
可以使用raise关键字来主动触发异常,并可以在括号内加入对该异常的说明。执行效果如图所示:
raise ZeroDivisionError("这是一个非常非常非常、很大很大很大的异常。。。")
raise可用于创建自己的异常类,用于定义新的异常。
当程序触发了某种条件(if True),则raise一个定义好的异常
如定义一个名为DangerousError的异常:
class DangerousError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
if True:
raise DangerousError("异常警告!异常警告!异常警告!异常警告!异常警告!\n异常警告!异常警告!异常警告!异常警告!异常警告!")
else:
raise DangerousError("请把代码拿回重写。")
⑤ try…except…else…finally 逻辑
try后边是要处理的部分,
如果try部分触发的异常的名字在except后边(或Exception),则执行Exception后边的代码;
except可以有多个,且没有数量限制,匹配的时候回从第一个开始依次往下匹配;
如果有触发异常,但该异常不被except所匹配,则还是会报错;
class DangerousError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
AError = DangerousError("犯了DangerousErrorA错误")
BError = DangerousError("犯了DangerousErrorB错误")
CError = DangerousError("犯了DangerousErrorC错误")
Elist = [AError, BError, CError, TypeError('1233211234567')]
for i in range(4):
print(i)
try:
raise Elist[i]
except DangerousError as e:
print(e)
如图,前三个异常被处理,第四个异常没有被处理,产生报错。
当try后边的代码没有被发现有异常时,则执行else后边的代码。
for i in range(4):
try:
print(i)
except DangerousError:
print("异常产生。")
else:
print("一切正常。")
不论异常处理结果如何,finally后边的代码一定会执行。
即使
for i in range(4):
try:
if i < 3:
print(i)
else:
print(i)
raise AError
except DangerousError:
print("异常产生。")
else:
print("一切正常。")
finally:
print("异常处理完成。")
当try…except部分检测到不匹配的异常时,程序在运行finally后结束执行,报出异常:
以该例为例,第二个异常TypeError(‘1233211234567’)与DangerousError不匹配。
所以循环只执行了两次,并在输出了两次"处理完成。"后程序结束。
最外层的print(“hello world!”)始终不被执行。
Elist = [AError, TypeError('1233211234567'), BError, CError]
for i in range(4):
print(i)
try:
raise Elist[i]
except DangerousError as e:
print(e)
finally:
print("处理完成。")
print("hello world!")
来源:https://blog.csdn.net/weixin_48964486/article/details/123190018


猜你喜欢
- 作为一个信号库,使用时候是支持一对一以及一对多的订阅模式,可以实现发送数据等,一般情况下,只要能够使用到Blinker的,一般都是应用在技术
- **一 tf.concat( ) 函数–合并**In [2]: a = tf.ones([4,35,8]) &n
- 废话不多说,直接上官网demopackage mainimport ("log""github.com/fsn
- 前言众所周知,Python中没有所谓的main函数,但是网上经常有文章提到“ Python的main函数&rdq
- 在一群里有朋友发问,有时间,也就看看了,不多说了,看图了:用一般的 select .... order 排序出来,就如下图了,是
- 实现一个AuditLog的功能,是B/S结构专案。 每个用户可以登录系统,在程序中操作数据(添加,更新和删除)需要实现记录操作跟踪。是谁添加
- 内置数据类型文本类型:str数值类型: int,float,complex序列类型:list,tuple,range映射类型: dict集合
- 区别与联系: 1、get是从服务器上获取数据,post则是向服务器传送数据; 2、get将表单中数据的按照variable=value的 形
- 关于这个问题的解答,网络上有成千上万个版本,当然,出现问题的诱因不同,解决的途径也不同,所以我不排除其他解决此类问题的办法,但是这些办法都没
- 目录前言为什么要用numpy数组的创建生成均匀分布的array:生成特殊数组获取数组的属性数组索引,切片,赋值数组操作输出数组总结前言Num
- 一、定位元素的8种方式1、方法介绍定位一个元素定位多个元素含义find_element_by_id()find_elements_by_id
- golang并没有像C语言一样提供三元表达式。三元表达式的好处是可以用一行代码解决原本需要多行代码才能完成的功能,让冗长的代码瞬间变得简洁。
- 本文研究的主要是Python中optparser库的相关内容,具体如下。一直以来对optparser不是特别的理解,今天就狠下心,静下心研究
- Flask web上传获取图像Image读取并使用图片上传界面后端@app.route('/upload')def uplo
- 在我们想要捕获的URL部分上加上小括号,Django 会将捕获的文本作为位置参数传递给视图函数。 在更高级的用法中,还可以使用 命名 正则表
- 一、需求说明当我们写爬虫的时候,经常会遇到json格式的数据,它通常是如下结构:data = [{'name':'小
- 业务需求:需要测试手机滑动解锁失败时事件的次数及等待的时间,本来想利用Python+Appium实现,但是Appium运行时自动给我解锁了.
- 官方网站 : www.python.orgPython is an interpreted, interactive, object-ori
- 在进行PHP编程时,需要对服务器某个目录下面的文件进行浏览,通常成为遍历目录。取得一个目录下的文件和子目录,就需要用到opendir()函数
- 本文实例讲述了GO语言延迟函数defer用法。分享给大家供大家参考。具体分析如下:defer 在声明时不会立即执行,而是在函数 return