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. Lightoj 1021【状压DP(未搞)】

    状态压缩一下,然后DP还是很容易想到,dp[i][j]表示状态为i时,模 k 为 j 的排列数的个数,然后每次对一个状态扩展,添加新的数字: 然而那个取膜没懂.....

  2. IT行业技术及程序员相关网站荟萃

    最近我花了一些时间收集了一些与自己工作相关的常用的网址,由于时间关系,暂时只是收集了这么多,以后有时间再随时添加. 1.程序员网址导航pg265 http://www.pg265.com/TNT程序网 ...

  3. bootstrap添加多个模态对话框支持

    bootstrap添加多个模态对话框支持 (2015-03-04 21:05:35) 转载▼ 标签: 房产   因为项目需要,在页面交互上要弹出多个dialog窗口,而bootstrap的modal支 ...

  4. [Xcode 实际操作]九、实用进阶-(27)字符串文件(Localizable.strings)的本地化

    目录:[Swift]Xcode实际操作 本文将演示字符串文件(Localizable.strings)的本地化. 在项目[DemoApp]文件夹下点击鼠标右键,弹出右键菜单 ->[New Fil ...

  5. win10子系统linux编译ffmpeg

    android-ndk-r14b(linux版) ffmpeg-4.0 开启win10子系统(控制面板->程序和功能->启用或关闭Windows功能 然后在 适用与 Linux 的 Win ...

  6. django-返回客户端外网ip服务

    在服务器应用初始化的时候,比如salt-minion,需要在配置文件里说明自己的id,一般用ip. 如果都在一个内网里,从ip命令里获取就行了. 但现在的企业后台环境更加复杂,很多都是跨机房.有物理机 ...

  7. __contains__, __len__,__reversed__

    __contains__():当使用in,not in 对象的时候 调用(not in 是在in完成后再取反,实际上还是in操作) class A(object): def __init__(self ...

  8. LOJ6212(博弈论)

    n <= L 和 n <= 2L 情况显然,一次就能取完: 分析 n > 2L 时: Alice手速太快,Bob同学是弱势群体,所以Bob肯定不能单纯地模仿Alice,那样顶多是平手 ...

  9. bryce1010专题训练——LCA

    1.Targan算法(离线) http://poj.org/problem?id=1470 /*伪代码 Tarjan(u)//marge和find为并查集合并函数和查找函数 { for each(u, ...

  10. (转载)Unity 优化总结

    Unity 优化总结 2017-03-10 | 发布 大海明月  zengfeng75@qq.com  | 分类 Unity  | 标签 Unity  优化 相关文档 UGUI 降低填充率技巧两则 U ...