20220221

案例

def product(x):result = 1print(x)count = 0for i in x:try:result *= float(i)except Exception as e:count += 1return xfinally:breakreturn result

Python3 try-except、raise和assert解析

一、说明

关于异常捕获try-except:在学java的时候就被教育异常捕获也是java相对c的一大优点,几年下来多少也写了些代码,但异常捕获总只得其形未得其神,在自己这只是让发生错误的程序在不必要终止时不终止而已。

关于主动抛出异常raise:前段时间看到robot framework判断测试用例运行失败,是监控自己使用raise主动抛出的异常,这才有了主动抛出异常的概念。

关于断言assert:前段时间写了个模糊测试工具,然后发现很多可以导致宕机的问题,开发排查后说是新加的断言导致的问题;当时对断言并不太清楚,他们修复问题后也没深入追究。

其实这里最主要是说,了解之后发现,try-except、raise和assert其实有相当大的关系,有必要记一记。

二、异常捕获try-except

异常捕获没有很多说的,各语言意思都差不多只是书写格式有点区别,我们直接上示例:

def testTryExcept():try:file_obj = open('myfile.txt')str_var = file_obj.readline()int_var = int(str_var.strip())# 如果检测到是OSError类异常,进行以下处理# OSError as err表示给当前捕获到的OSError异常起别名为err;名字叫什么可以是随意的except OSError as err:print(f"OS error: {err}")# 如果不是OSError检测到是ValueError,进行以下处理except ValueError:print("Could not convert data to an integer.")# 如果既不是OSError也不是ValueError而是其他异常,进行以下处理# Exception as e表示给当前捕获到的异常起别名为e;名字叫什么可以是随意的# 如果不需要打印e,那么Exception as e这部分可省略# 我自己而言,不会捕获具体的异常类型,即不会像上面一样单独捕获OSError和ValueError,就只写下边这么一个except就完了except Exception as e:print(f"Unexpected error: {e}")# 不管是否发生异常,finally部分都会执行# 对于异常捕获而言,finally部分经常可以没有,至少一直以来我都不怎么写finally:file_obj.close()

三、主动抛出异常raise

在上面的try-except中我们都是被动等待异常出现然后进行捕获----事实上这些被动等待的异常本质上也是库函数使用raise主动抛出的----我们完全可以使用raise主动抛出异常,进一步说我们可以使用raise抛出自己定义的异常。

主动抛出异常的好处,一是可以抛出在语法上不被认为是异常但在功能上我们认为是异常的情况,二是可以自定义自己的异常报错语句更方便异常的定位和排查。

注意,主动抛出的异常扔是异常,所以仍可以用try-except来捕获。

# 自定义的异常类都要继承Exception类,至少是间接继承Exception类
class PasswordException(Exception):# 在init方法中定义一个password变量def __init__(self,password):self.password = passworddef __str__(self):return repr(self.password)def testRaise():# 主动抛出异常示例try:username = input("please enter your username:")# 输入的用户名不是admin就抛出异常Exceptionif username != "admin":raise Exception(f"maybe your privilege is not enough: {username}")# 可以看到打印的是我们自定义的异常语句except Exception as e:print(f"{e}")# 主动抛出自定义异常示例try:password = input("please enter your password:")# 输入的密码不是123456就抛出自定的的PasswordException异常if password != "123456":raise PasswordException(password)# 我们自定义的异常有password变量,所以我们可以直接选择把变量打印出来except PasswordException as e:print(f"PasswordException: {e.password}")if __name__ == "__main__":testRaise()

四、断言assert

4.1 assert本质讨论

更多参见官方文档:7. Simple statements — Python 3.10.2 documentation

assert使用形式如下:

assert expression ["," expression]

如果只接一个表达示,那相当于如下:

if __debug__:if not expression: raise AssertionError

如果接两个表达示,那相当于如下:

if __debug__:if not expression1: raise AssertionError(expression2)

其中涉及的__debug__和AssertionError如下:

__debug__:如果程序运行时不带-O参数,则为True;反之则为False。

AssertionError:就是一个继承Exception类的异常类,其源代码在builtins.py中,如下图所示

所以,本质上,assert就是raise的一个宏定义;当前紧接的好个表达示不为True时,就抛出异常。

4.2 assert的使用

assert经常用于参数被使用前的检查操作,如果检查未通过则直接抛出异常及早发现错误,避免明显错误的参数还被往后传递。

注意,由于assert本质上还是raise,所以一样可以使用try-except捕获,而不是说断言错误程序就一定会终止。

def testAssert():try:int_var = int(input("please enter a positive number:"))# 如果输入的数值不大于0,断言失败,抛出异常assert int_var > 0except:print(f"sorry, please enter a positive number")print(f"what you enter is: {int_var}")if __name__ == "__main__":testAssert()

参考:

Python3 错误和异常 | 菜鸟教程

Python3 try-except、raise和assert解析相关推荐

  1. python raise和except区别_Python3 try-except、raise和assert解析

    一.说明 关于异常捕获try-except:在学java的时候就被教育异常捕获也是java相对c的一大优点,几年下来多少也写了些代码,但异常捕获总只得其形未得其神,在自己这只是让发生错误的程序在不必要 ...

  2. python中raise和raise e区别_python raise和assert的区别

    python中raise和assert的区别 一.使用raise抛出异常 python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,r ...

  3. Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫)

    Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫) https://blog.csdn.net/u012662731/article/details/78537432 出 ...

  4. python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)

    原标题:[实战练习]Python3网络爬虫快速入门实战解析(上) 摘要 使用python3学习网络爬虫,快速入门静态网站爬取和动态网站爬取 [ 前言 ] 强烈建议:请在电脑的陪同下,阅读本文.本文以实 ...

  5. python raise和except区别_python raise和assert的区别

    python中raise和assert的区别 一.使用raise抛出异常 python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,r ...

  6. Python3网络爬虫快速入门实战解析

    Python3网络爬虫快速入门实战解析 标签: python网络爬虫 2017-09-28 14:48 6266人阅读 评论(34) 收藏 举报 分类: Python(26) 作者同类文章X 版权声明 ...

  7. Python零基础速成班-第6讲-Python异常处理Exception,tryexcept,raise,assert,输入模块pyinputplus

    Python零基础速成班-第6讲-Python异常处理Exception,try&except,raise,assert,输入模块pyinputplus 学习目标 异常处理Exception: ...

  8. Python3 网络爬虫快速入门实战解析

    点击上方"Python高校",关注 文末干货立马到手 作者:Jack Cui http://cuijiahua.com/blog/2017/10/spider_tutorial_1 ...

  9. Python3 爬虫学习笔记 C07 【解析库 lxml】

    Python3 爬虫学习笔记第七章 -- [解析库 lxml] 文章目录 [7.1]关于 lxml [7.2]使用 XPath [7.3]查找所有节点 [7.4]查找子节点 [7.5]查找父节点 [7 ...

最新文章

  1. 刚刚,华为重磅宣布:无人驾驶正式上高速!
  2. eccv2020 目标检测笔记
  3. Maven中jar包冲突的解决方式
  4. laravel5.6 Session
  5. myeclipse新建映射文件xxx.hbm.xml
  6. (原创)VS2017 C# 运行 Javasrcipt RSA 加密用户名登录 Java开发的服务器
  7. Weblogic10 集群配置
  8. 插入数据类型为DateTime时为空值时,为什么SQL SERVER会自动加上1900-01-01
  9. 深度学习pytorch--线性回归(三)
  10. 车路云一体化融合控制系统
  11. 群晖系统,部署JAVA-JAR包,SpringBoot项目,手工启动
  12. windows电脑桌面透明便签待办分类怎么添加
  13. zotero+坚果云同步
  14. 在WORD中批量修改图片大小
  15. I2C driver编写指导二:编写i2c client driver指南
  16. Lvs+keepAlived实现负载均衡高可用集群(DR实现)
  17. VNPY策略加密教程
  18. 网络支付结算{网银、第三方支付、超级网银}
  19. 对于安装破解版BurpSuite无法用java打开注册机的问题
  20. JavaScript数组方法三板斧,100%的开发都得知道

热门文章

  1. Python gRPC 安装
  2. etcd 笔记(09)— 基于 etcd 实现微服务的注册与发现
  3. python版本控制神器Virtualenvwrapper的使用
  4. “年轻”有价值,才是本钱
  5. 力所能及的做些自己喜欢和有趣的事
  6. Win10家庭版如何启用本地组策略
  7. BERT-Pytorch demo初探
  8. 同步与异步,阻塞与非阻塞的区别
  9. Clang:LLVM 的 C 语言家族前端
  10. 空间点像素索引(二)