Python学习之自定义异常详解
作者:渴望力量的哈士奇 发布时间:2021-05-05 18:46:20
在上一章我们学习了 异常的三个关键字,分别是try、except 以及 finally。我们知道在 try 代码块中如果遇到错误就会抛出异常,交给 except 提前定义好的错误类型进行匹配并捕获,如果成功捕获到异常就会交给 except 的代码块进行执行,最后的 finally 是无论如何都会执行的代码块。
那么在 try 语法块中是谁抛出的异常?优势如何抛出的呢?首先抛出异常的是 Python 的解释器,它在脚本执行的时候发现了错误并将其抛出,而如何抛出的呢?捕获的异常优势如何定义的呢?
带着这样的疑问,我们就学习一下如何自己书写一个异常类型,并主动抛出异常。
当我们学会了自定义一个异常以及主动抛出异常的时候,就可以主宰一个异常的发生。在之前我们学习的如 NameError 、TypeError … 这些都是 Python 内置给我们定义好的,我们只能老老实实的使用他们。通过今天的学习,我们就可以变被动为主动,因为在实际工作中有太多的场景是 内置的异常所触及不到的,而这时候使用我们自己定义的异常类型就可以更好的打通业务。
自定义抛出异常关键字 - raise
raise 关键字的功能:可以将信息已报错的形式抛出
raise 关键字的用法:示例如下
# 用法:
raise 异常类型(message)
# 参数:
# message:为要输出的错误信息
# 这样的当程序执行到 raise 关键字这一行的时候,python 解释器就会根据 raise 的要求抛出异常错误。
# 返回值:
# 因为 raise 关键字是抛出一个异常,所以是没有返回值的
演示小案例 - 1
raise ValueError('使用 raise 主动抛出异常。')
# >>> 执行结果如下:
# >>> Traceback (most recent call last):
# >>> File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 87, in <module>
# >>> raise ValueError('使用 raise 主动抛出异常。')
# >>> ValueError: 使用 raise 主动抛出异常。
# >>> 这里我们使用的是 ValueError 异常类型,其实我们可以使用任意的异常类型。
# >>> 实在不知道使用什么异常类型,使用 Exception 也是一个不错的选择
演示小案例 - 2
def test(num):
if num == 100:
raise ValueError('传入的参数 \'num\' 不可以为100')
return num
result = test(100)
print(result)
# >>> 执行结果如下:
# >>> Traceback (most recent call last):
# >>> File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 21, in <module>
# >>> result = test(100)
# >>> File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 17, in test
# >>> raise ValueError('传入的参数 \'num\' 不可以为100')
# >>> ValueError: 传入的参数 'num' 不可以为100
那么主动抛出的 raise 能不能被捕获呢?我们试一下。
def test(num):
if num == 100:
raise ValueError('传入的参数 \'num\' 不可以为100')
return num
# result = test(100)
def test2(num):
try:
return test(num)
except ValueError as e:
return e
result = test2(100)
print(result)
# >>> 执行结果如下:
# >>> 传入的参数 'num' 不可以为100
再思考一个问题,如果 raise 关键字后面不跟随错误类型,仅仅是 字符串提示信息,能否进行抛出错误呢?
def test3():
raise '主动抛出异常'
test3()
# >>> 执行结果如下:
# >>> Traceback (most recent call last):
# >>> File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 38, in <module>
# >>> test3()
# >>> File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 36, in test3
# >>> raise '主动抛出异常'
# >>> TypeError: exceptions must derive from BaseException
# >>> TypeError: 异常必须得基于基础异常类 (BaseException:基础异常类 - 也就是 'Exception')
# >>> 这里的确抛出了一个异常,但是并不是我们 raise 关键字主动抛出的异常
# >>> 而是 Python解释器发现 raise 关键字的用法不正确抛出的 TypeError 的 异常类型
由此得出结论: raise 关键字 后面必须要配合一个 异常类型 ,才可以正常使用。
自定义异常类
Exception 是一个通用异常类型,在我们不知道、不确定该使用什么异常类型的时候,就可以通过 Exception 来捕获 或者 结合 raise 关键字主动抛出异常。
同时 Exception 是所有异常类型的基类(父类),所以如果我们想要自定义一个异常类型,就需要继承 Exception 基类 。
基类继承之后我们还需要 自定义一个错误的消息;满足这两个条件之后,我们就可以去自定义一个异常类。
总结:
自定义异常必须继承基类:Exception
需要在构造函数中自定义错误的信息
来看一个示例:
class NewError(Exception):
def __init__(self, message):
self.message = message
def test():
raise NewError('这是一个自定义异常')
try:
test()
except NewError as e:
print(e)
# >>> 执行结果如下:
# >>> 这是一个自定义异常
接下来 我们自定义一个检查 name 传参的异常,然后进行校验
class CheckNameError(Exception):
def __init__(self, message):
self.message = message
def check_name(name):
if name == 'Neo':
raise CheckNameError('\'Neo\'的名字不可以作为传参参数')
return name
try:
check_name('Neo')
except CheckNameError as e:
print(e)
# >>> 执行结果如下:
# >>> Neo'的名字不可以作为传参参数
# 尝试一下如果不使用我们 try 捕获我们的自定义异常试试
class CheckNameError(Exception):
def __init__(self, message):
self.message = message
def check_name(name):
if name == 'Neo':
raise CheckNameError('\'Neo\'的名字不可以作为传参参数')
return name
check_name('Neo')
# >>> 执行结果如下:
# >>> __main__.CheckNameError: 'Neo'的名字不可以作为传参参数
来源:https://blog.csdn.net/weixin_42250835/article/details/123512888
猜你喜欢
- 前言Celery在python中的应用除了实现异步任务(async task)外也可以执行定时任务(beat)一、Celery定时任务是什么
- pyyaml模块在python中用于处理yaml格式数据,主要使用yaml.safe_dump()、yaml.safe_load()函数将p
- filetype.pySmall and dependency free Python package to infer file type
- 1. 引言之前已经有博客专门介绍了Python中的列表生成式,可能大家还不太擅长。这里推荐九个Python列表生成式的面试题(从简单到困难排
- 效果展示打地鼠小游戏简介打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠呗~首先,让我们确定一下游戏
- 如下所示:import cv2vidcap = cv2.VideoCapture('005.avi')success,ima
- 一、前言确保安装scikit-imagenumpy二、Dataset一个例子:# 导入需要的包import torchimport torc
- 在Python列表操作中:列表乘以某一个数,如list2 = list1 * 2 得到一个新的列表是list1的元素重复n次,且list1不
- 对单词最后一个字母的预测LSTM 的原理自己找,这里只给出简单的示例代码,就是对单词最后一个字母的预测。# LSTM 的原理自己找,这里只给
- 1、有一个论坛,帖子的数据巨大,请简要说明如何提高用户搜索帖子的效率。 在程序方面,可以使用页面缓存技术。在前台界面着设计方面也可以让用户输
- 该语句的作用是:启用或禁用错误处理程序。一般用法如下:On Error Resume NextOn Error GoTo 0如果在您的代码中
- 在Dreamweaver 4.0中,我们就已接触了模板与库的概念,知道它们是批量生成风格类似的网页的好工具。如今在Dreamweaver M
- eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式
- IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来,这里的CSS属性可以是元素固
- windows下安装Virtualenvwrapper我们可以使用Virtualenvwrapper来方便地管理python虚拟环境,但是在
- 概述从前面的对Python基础知识方法介绍中,我们几乎是围绕Python内置方法进行探索实践,比如字符串、列表、字典等数据结构的内置方法,和
- 如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能。如下图: 第一层
- 一、决策树的特点1.优点具有很好的解释性,模型可以生成可以理解的规则。可以发现特征的重要程度。模型的计算复杂度较低。2.缺点模型容易过拟合,
- 本文主要研究的是flask使用session保存登录状态及拦截未登录请求的相关内容,具体介绍如下。前端请求form:<form act
- 从几年前开始学习编程直到现在,一直对程序中的异常处理怀有恐惧和排斥心理。之所以这样,是因为不了解。这次攻python,首先把自己最畏惧和最不