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. lightoj1145 【DP优化求方案】

    题意: 有一个k面的骰子,然后问你n个骰子朝上的面数字之和=s的方案: 思路: dp[i][j] 代表 前 i 个骰子组成 j 有多少种方案: 显然 dp[i][j] = dp[i - 1][j - ...

  2. SQL 语句(原生)

    //查 //查询表里的所有数据 select * from 表名 //根据id等字段查询数据 select * from 表名 where 字段 = 值 or 字段 = 值 (例):select * ...

  3. [HNOI2010] 平面图判定 planar

    标签:二分图判定.题解: 首先可以把题目中给你的那个环给画出来,这样就可以发现对于任意一个图来说,如果两条边要相交,就不能让他们相交,那么这两条边就要一条在里面一条在外面,如果把环画成一条链,那么就是 ...

  4. [Xcode 实际操作]八、网络与多线程-(16)使用网址会话对象URLSession下载图片并显示下载进度

    目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession显示下载图片的进度. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模式 ...

  5. IT兄弟连 JavaWeb教程 JSP内置对象经典案例

    案例需求:使用MVC模式编写一个程序当发起一个deptList.do请求时在servlet中准备一个部门列表对象,把这个列表对象放入request作用域中,然后转发到deptlist.jsp,使用js ...

  6. Android NFC P2P

    http://www.nfc.cc/2011/12/28/development-android-beam-and-nfc-peer-2-peer/

  7. JPA-day04 核心API 一级缓存 主键生成策略 实体对象的4种状态 多对一关系 延迟加载

  8. java利用myeclipse自带三大框架搭建三大框架(Hibernate+Struts2+Spring)过程详解

    搭建过程因人而异,我的搭建过程大致是这样的: 1.创建一个javaweb项目: 2.导入Spring框架,上图: 2.1: 2.2: 2.3: 3.导入struts2框架,上图: 3.1: 3.2: ...

  9. scrapy框架中选择器的用法

    scrapy框架中选择器的用法 Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中 ...

  10. 记一下一道关于finally的题

     题目: public class Test{ public int add(int a,int b){ try { return a+b; } catch (Exception e) { Syste ...