一、说明

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

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

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

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

二、异常捕获try-except

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

deftestTryExcept():try:

file_obj= open('myfile.txt')

str_var=file_obj.readline()

int_var=int(str_var.strip())#如果检测到是OSError类异常,进行以下处理

#OSError as err表示给当前捕获到的OSError异常起别名为err;名字叫什么可以是随意的

exceptOSError as err:print(f"OS error: {err}")#如果不是OSError检测到是ValueError,进行以下处理

exceptValueError:print("Could not convert data to an integer.")#如果既不是OSError也不是ValueError而是其他异常,进行以下处理

#Exception as e表示给当前捕获到的异常起别名为e;名字叫什么可以是随意的

#如果不需要打印e,那么Exception as e这部分可省略

#我自己而言,不会捕获具体的异常类型,即不会像上面一样单独捕获OSError和ValueError,就只写下边这么一个except就完了

exceptException as e:print(f"Unexpected error: {e}")#前边的print(f"{e}")形式只会打印异常的概要信息,如果要打印异常的堆栈信息要使用别的写法

#方法一:traceback

#import traceback

#print(f"{traceback.format_exc()}")

#方法二:logging.exception()

#import logging

#logging.exception(e)

#不管是否发生异常,finally部分都会执行

#对于异常捕获而言,finally部分经常可以没有,至少一直以来我都不怎么写

finally:

file_obj.close()

三、主动抛出异常raise

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

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

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

#自定义的异常类都要继承Exception类,至少是间接继承Exception类

classPasswordException(Exception):#在init方法中定义一个password变量

def __init__(self,password):

self.password=passworddef __str__(self):returnrepr(self.password)deftestRaise():#主动抛出异常示例

try:

username= input("please enter your username:")#输入的用户名不是admin就抛出异常Exception

if username != "admin":raise Exception(f"maybe your privilege is not enough: {username}")#不过要注意这样raise一个Exception会丢掉异常的堆栈信息,如果要原样返回异常可以直接写raise

#raise

#可以看到打印的是我们自定义的异常语句

exceptException as e:print(f"{e}")#主动抛出自定义异常示例

try:

password= input("please enter your password:")#输入的密码不是123456就抛出自定的的PasswordException异常

if password != "123456":raisePasswordException(password)#我们自定义的异常有password变量,所以我们可以直接选择把变量打印出来

exceptPasswordException as e:print(f"PasswordException: {e.password}")if __name__ == "__main__":

testRaise()

四、断言assert

4.1 assert本质讨论

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捕获,而不是说断言错误程序就一定会终止。

deftestAssert():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()

参考:

python raise和except区别_Python3 try-except、raise和assert解析相关推荐

  1. python对比数据的原理_Python3 filecmp模块测试比较文件原理解析

    1.filecmp比较文件 filecmp模块提供了一些函数和一个类来比较文件系统上的文件和目录. 1.1 示例数据 使用下面代码创建一组测试文件. import os def mkfile(file ...

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

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

  3. Python 中 raise 和 raise/from 的区别

    Python 中 raise 和 raise/from 的使用方法 文章目录 Python 中 raise 和 raise/from 的使用方法 0. 参考资料 1. 代码比较 2. 用法解释 2.1 ...

  4. Python 2.x 与 Python 3.x 的区别

    前言 如果你是刚接触 Python 的初学者,那你可能是直接学习 Python 3.x 版本.对于 Python 2.x 的版本是不会有所接触.官方也宣布在 2020 停止对 Python 2.x 的 ...

  5. python错误-python异常与错误区别

    错误和异常概念 错误: 1.语法错误:代码不符合解释器或者编译器语法 2.逻辑错误:不完整或者不合法输入或者计算出现问题 异常:执行过程中出现万体导致程序无法执行 1.程序遇到逻辑或者算法问题 2.运 ...

  6. python工程师是什么专业-猎维科技告诉你人工智能工程师与Python工程师有什么区别?...

    学习Python就等于学习人工智能吗?当然不!千万不要混淆它们的概念!Python工程师并不等同于人工智能工程师.(关注公众号"猎维人工智能") Python工程师与人工智能工程师 ...

  7. php和python区别-PHP与Python语言有哪些区别之处?选择哪一个好?

    其实针对不同阶段的学者来说,他们的需求自然也有所不同.本篇文章主要分析了php和python哪个好以及介绍PHP与Python的区别之处,希望对还在为学习PHP和Python中哪一个语言而摇摆不定的朋 ...

  8. java和python的web自动化有什么区别-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  9. c+和python的区别-c语言和python之间有什么区别

    c语言和python的区别是:1.Python是一种面向对象的解释型语言,通过缩进来表示语句体,在Python中每一条语句结尾后没有分号:2.C是一种面向过程的编译型语言,通过"{}&quo ...

最新文章

  1. 贪吃蛇游戏(c/c++)
  2. docker -v 文件夹下没有数据_详细!快速入门指南!Docker
  3. Luogu P5652 基础博弈练习题 (博弈论、图论)
  4. 学术好帮手Publons使用指南
  5. Cpp 对象模型探索 / 不能被继承的类
  6. keras从入门到放弃(十六)内置预训练网络VGG
  7. Mac下Virtual Box Host-Only网络配置
  8. mysql查询09软件技术1班_MySQL查询语句的45道练习(2019.09最新版)
  9. Jerry的通过CDS view + Smart Template 开发Fiori应用的blog合集
  10. 四川高职计算机二本线学校,全网首发!四川省本科二批次2019年对口高职投档录取线出炉...
  11. 最新版FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用简介
  12. 动态设置样式 calc计算
  13. hdfs 中chunk_HDFS读写流程
  14. 中国ai人工智能发展太快_新的AI计算遥远行星的速度快100,000倍
  15. 算术平均数及几何平均数
  16. Python基础_第2章_Python运算符与if结构
  17. Redis 入门和 RedisTemplate 常用方法(常用命令 + 案例源码)
  18. windows 搜索文件内容 txt 、excel 、word、c、java 、压缩文件 等文件内容
  19. 【c++】c++中顶层const与底层const
  20. win10家庭中文版安装Hyper-V 解决Hyper-V.cmd闪退问题

热门文章

  1. 目前月薪存一百万需要多久?
  2. 线代 | 【行列式及矩阵】基本知识
  3. 敏捷开发之道 总结小记
  4. wps怎么把ppt里的字体一起保存_如何将特殊字体随PPT一起保存?
  5. WEB安全性测试测试用例(基础).doc
  6. hdu2018 母牛的故事(模拟)
  7. 蓝桥杯 提高题 母牛的故事
  8. LDAP基础:8:ldap用户密码确认和修改
  9. table合并单元格 colspan(跨列)和rowspan(跨行)
  10. python 按列读取数据并写入txt_Python数据分析之Pandas读写外部数据文件!