python 异常捕获详解流程
作者:侯小啾 发布时间:2022-06-12 15:31:04
1 捕捉一个异常
捕捉一个异常 以用0作为除数会得到ZeroDivisionError异常为例,
print(1/0)
为例程序的持续执行,不因该异常而中止, 遂对该异常进行处理,使异常时输出该异常内容:
try:
print(1/0)
except ZeroDivisionError as e:
print(e)
2 捕捉多个异常
捕捉指定的多个异常,以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)
3 Exception捕捉所有异常
如果异常的种类不确定,则可以使用Exception来指代所有种类的异常。
以一个数值和一个字符串相加为例:
try:
print(1 + 'strstrstr')
except Exception as e:
print(e)
4 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("请把代码拿回重写。")
5 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
猜你喜欢
- 目录1. 配置Python环境变量2. 安装Python编辑器,并在其中配置Python3. 安装控制包uiautomator2,和其它辅助
- Innodb:[fb]# ll -hs url_comment_*.ibd633M -rw-rw---- 1 mysql mysql 632
- 即使在urlencode之前str.decode(“cp936″).encode(“utf-8″)做了编码转换也是没用的。后来查询手册查到一
- 1、现象a.用localhost访问,正常b.用IP地址访问,则出现403错误2、分析a.怀疑是ACL问题,设置Everyone为完全控制,
- 用两个文件.GLOBAL.ASA和online.asp下面分别给出两个文件的源代码.呵呵,我也是菜鸟,大家加油哟!<SCR
- 这样处理的弊端是:如果数据量大,子分类很多,达到4级以上,这方法处理极端占用数据库连接池 对性能影响很大。 如果用SQL下面的CTE递归处理
- 这几天在做一个数据集,由于不是很熟悉Linux下的命令,所以特地用了强大的python来做。我之前有一个数据集但是我只要里面名称带有comp
- SQL1: --1、查看表空间的名称及大小 SELECT t.tablespace_name, round(SUM(bytes / (102
- Q0.创建用户【前提】 你必须有CREATE USER系统权限。当你使用CREATE USER语句创建一
- 加班时抽空弄的,javascript图片链接定时轮换,自适应图片大小,支持预载,进行了简单封装,方便调用。发现自己还是菜得很,一个简单效果被
- 以前大家谈了很多有关打开数据库连接安全的问题,现在我再提出一种思路:使用activex dll来保护你的代码。(既可以不用为使用共享的加密软
- 你一定很熟悉Youtube了,知道它是一个视频分享网站。是的,youtube目前十分流行,你也许会常常访问。这里有一些关于youtube u
- 数据库系统的安全性包括很多方面。由于很多情况下,数据库服务器容许客户机从网络上连接,因此客户机连接的安全对MySQL数据库安全有很重要的影响
- 本文实例讲述了PHP面向对象的特性。分享给大家供大家参考,具体如下:Demo1.php<?php header('
- 什么是MySql数据库?通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合。我们通常
- WordPress 本身以及主题和插件通常需要加载一些 JavaScript 来实现某些特殊功能。为了最大限度地保证兼容性,不至于出现 Ja
- PHP在运行时, 针对严重程度不同的错误,会给以不同的提示。 eg:在$a没声明时,直接相加,值为NULL,相加时当成0来算.但是,却提示N
- 有没有办法更快一点? 有没有办法一次性收缩所有数据库? 代码如下:alter database 数据库名 set recovery simp
- 用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的。代码:
- 本例最终效果图: 新建图像文件后选Channels面板,新建Alpha1通道:输