Python3 try-except、raise和assert解析
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 = password def __str__(self):
return repr(self.password) def testRaise():
# 主动抛出异常示例
try:
username = input("please enter your username:")
# 输入的用户名不是admin就抛出异常Exception
if 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本质讨论
更多参见官方文档:https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement
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 > 0
except:
print(f"sorry, please enter a positive number")
print(f"what you enter is: {int_var}") if __name__ == "__main__":
testAssert()

参考:
https://www.runoob.com/python3/python3-errors-execptions.html
Python3 try-except、raise和assert解析的更多相关文章
- python raise和assert的区别
python中raise和assert的区别 一.使用raise抛出异常 python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,r ...
- python之raise、assert、with/as环境管理器
要故意出发异常,可以使用raise语句,形式如下: raise <name> #manually trigger an exception raise<name>,<v ...
- Python3编写网络爬虫06-基本解析库Beautiful Soup的使用
二.Beautiful Soup 简介 就是python的一个HTML或XML的解析库 可以用它来很方便的从网页中提取数据 0.1 提供一些简单的 python式的函数来处理导航,搜索,修改分析树等功 ...
- python Exception中的raise、assert
使用raise抛出异常 当程序出现错误,python会自动引发异常,也可以通过raise显式地引发异常.一旦执行了raise语句,raise后面的语句将不能执行. 演示raise用法. try: s ...
- python3.4.3 调用http接口 解析response xml后插入数据库
工作中需要调用一个http的接口,等不及java组开发,就试着用python去调用.Python版本3.4.3 完整的流程包括:从sqlServer取待调用的合同列表 -> 循环调用http接口 ...
- Python3编写网络爬虫07-基本解析库pyquery的使用
三.pyquery 简介:同样是一个强大的网页解析工具 它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便 安装: pip install pyquery 验证: im ...
- Python3编写网络爬虫05-基本解析库XPath的使用
一.XPath 全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索 XPath 的选择功能十分强大,它提供了 ...
- Python错误调试-raise、assert
raise: raise语句手工引发一个异常:,这样做程序不会因异常而终止,而是运行报错 1 "raise" [expression ["," expressi ...
- python3中的raise使用
raise表示会抛出异常那么就是说raise会向python的解释器一个响应告诉解释器他的后面是一个异常让我们的程序中断 一般是和自定义的异常连用. class CustomError(Excepti ...
随机推荐
- HDU2444 【二分图判定+最大匹配】
套模板很好的题? #include<bits/stdc++.h> using namespace std; const int N=2e2+10; const int M=4e4+10; ...
- Forward Rendering 正向渲染
Forward Rendering 正向渲染 正向渲染一个基于着色器的渲染路径.它支持逐像素计算光照(包括法线贴图和灯光Cookies)和来自一个平行光的实时阴影.在默认设置中,少数最亮 ...
- MyBatist庖丁解牛(三)
从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个: SqlSession:作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能: Ex ...
- react-native-wechat微信组件的使用
对我来说link没有成功过,所以参考了其他人的文章,原文:https://www.jianshu.com/p/6a792118fae4 第一步:要去:https://open.weixin.qq.co ...
- JDBC连接池一 自定义连接池
package com.mozq.jdbc; import java.io.IOException; import java.io.InputStream; import java.sql.Conne ...
- Log4j2 - Unable to invoke factory method in class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFileAppender for element RollingFile
问题与分析 在使用Log4j2时,虽然可以正确读取配置文件并生成log文件,但偶然发现控制台打印了异常信息如下: 2018-12-31 17:28:14,282 Log4j2-TF-19-Config ...
- 统一入口&DB代理思想
参考 https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650764278&idx=2&sn=b7801fb0780 ...
- Restful API官方文档
理解Restful架构:http://www.ruanyifeng.com/blog/2011/09/restful RESTful设计指南:http://www.ruanyifeng.com/blo ...
- python语法:
1 #开始注释,‘’‘ ‘’’可以看做是文本字符串也可以看做是块注释:”:“开始后的缩进视为一个代码块类似{}:缩进没有规定,但一般4个空格,注意:粘贴复制代码一定要检查缩进:大小写敏感: 2 数据 ...
- yii2 使用gii生成代码文件
访问地址: http://localhost/yii2-test/web/index.php?r=gii 如果你通过本机以外的机器访问 Gii,请求会被出于安全原因拒绝. 在web.php修改gii ...