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解析的更多相关文章

  1. python raise和assert的区别

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

  2. python之raise、assert、with/as环境管理器

    要故意出发异常,可以使用raise语句,形式如下: raise <name>  #manually trigger an exception raise<name>,<v ...

  3. Python3编写网络爬虫06-基本解析库Beautiful Soup的使用

    二.Beautiful Soup 简介 就是python的一个HTML或XML的解析库 可以用它来很方便的从网页中提取数据 0.1 提供一些简单的 python式的函数来处理导航,搜索,修改分析树等功 ...

  4. python Exception中的raise、assert

    使用raise抛出异常 当程序出现错误,python会自动引发异常,也可以通过raise显式地引发异常.一旦执行了raise语句,raise后面的语句将不能执行. 演示raise用法. try: s ...

  5. python3.4.3 调用http接口 解析response xml后插入数据库

    工作中需要调用一个http的接口,等不及java组开发,就试着用python去调用.Python版本3.4.3 完整的流程包括:从sqlServer取待调用的合同列表 -> 循环调用http接口 ...

  6. Python3编写网络爬虫07-基本解析库pyquery的使用

    三.pyquery 简介:同样是一个强大的网页解析工具 它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便 安装: pip install pyquery 验证: im ...

  7. Python3编写网络爬虫05-基本解析库XPath的使用

    一.XPath 全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索 XPath 的选择功能十分强大,它提供了 ...

  8. Python错误调试-raise、assert

    raise: raise语句手工引发一个异常:,这样做程序不会因异常而终止,而是运行报错 1 "raise" [expression ["," expressi ...

  9. python3中的raise使用

    raise表示会抛出异常那么就是说raise会向python的解释器一个响应告诉解释器他的后面是一个异常让我们的程序中断 一般是和自定义的异常连用. class CustomError(Excepti ...

随机推荐

  1. 渲染路径-u3d渲染路径比较

    Unity支持不同的渲染路径.应具体取决于你的游戏内容和目标平台/硬件来选择使用哪一个.不同的渲染路径有不同的特点和性能特点,主要影响灯光和阴影.        项目所使用的渲染路径在Player S ...

  2. 3DMAX 6 游戏特效制作

    3d主要是粒子系统为主,一个特效可能包含多个粒子系统,需要注意粒子系统尽量减少多余参数,材质shader在手机上要经过优化 另外可以使用面片加脚本实现滚动效果,比如瀑布等等 具体方法以后补充,占位

  3. [Xcode 实际操作]二、视图与手势-(5)给图像视图添加圆角效果

    目录:[Swift]Xcode实际操作 本文将演示给矩形图片添加圆角效果 import UIKit class ViewController: UIViewController { override ...

  4. 51Nod 1099 任务执行顺序 (贪心)

    #include <iostream> #include <algorithm> using namespace std; +; struct node{ int r, q; ...

  5. numpy使用示例

    numpy介绍 创建numpy的数 一维数组是什么样子 可以理解为格子纸的一行就是一个一维数据 two_arr = np.array([1, 2, 3]) 二维数组什么样子 理解为一张格子纸, 多个一 ...

  6. Codeforces 1143B(思维、技巧)

    自己水平太低,不丢人. 结论是最后选取的数后缀一定是若干个9,暴举即可.然而暴举也有暴举的艺术. ll n; ll dfs(ll n) { if (n == 0) return 1; if (n &l ...

  7. bzoj3583 杰杰的女性朋友 || bzoj4362 Graph

    http://210.33.19.103/problem/2174 很显然是矩阵快速幂的题,设有in和ou矩阵,设in矩阵的转置为in' 显然可以直接暴力求出任意两点间走一步路径条数,然后求其d次幂, ...

  8. 24 使用Maven 或 Gradle构建groovy

    1       使用Maven 或 Gradle构建groovy 1.1  使用maven构建groovy pom.xml file. <dependencies>     ... oth ...

  9. vue项目打包后文本溢出代码消失问题

    补充 https://www.cnblogs.com/richard1015/p/8526988.html vue webpack 打包编译-webkit-box-orient: vertical 后 ...

  10. C. Functions again DP + 分类讨论

    http://codeforces.com/contest/789/problem/C 首先按题目要求处理出dis数组. 那么对于任意一个区间,[L, R],是dis[L] - dis[L + 1] ...