Python零基础入门篇 - 44 -自定义异常 [raise 关键字]
前言:
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 🐶哈士奇🐶 。(我真的养了一只哈士奇)
📑 个人主页:渴望力量的哈士奇主页
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥 如果感觉博主的文章还不错的话,还请不吝👍关注、点赞、收藏三连支持👍一下博主哦
💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬
📕系列专栏::
👍 Python全栈系列 - [更新中] ➡️➡️➡️ 【 本文在该系列】
👋 网安之路系列
🍋 网安之路踩坑篇
🍋 网安知识扫盲篇
🍋 Vulhub 漏洞复现篇
🍋 Shell脚本编程篇
🍋 Web攻防篇 ➡️➡️➡️ 2021年9月3日停止更新,转战先知等安全社区
🍋 渗透工具使用集锦 ➡️➡️➡️ 2021年9月3日停止更新,转战先知等安全社区
⭐️ 点点点工程师系列
🍹 测试神器 - Charles 篇
🍹 测试神器 - Fiddler 篇
🍹 测试神器 - Jmeter 篇
🍹 自动化 - RobotFrameWork 系列
🍹 自动化 - 基于 JAVA 实现的WEB端UI自动化
🍹 自动化 - 基于 MonkeyRunner 实现的APP端UI自动化
🤗 2019年之前学习Python留下的乱七八糟系列
🎉🎉欢迎持续关注🎉🎉 |
文章目录
在上一章我们学习了 异常的三个关键字,分别是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 # >>> raise ValueError('使用 raise 主动抛出异常。')# >>> ValueError: 使用 raise 主动抛出异常。# >>> 这里我们使用的是 ValueError 异常类型,其实我们可以使用任意的异常类型。# >>> 实在不知道使用什么异常类型,使用 Exception 也是一个不错的选择
演示小案例 - 2:
def test(num): if num == 100: raise ValueError('传入的参数 \'num\' 不可以为100') return numresult = test(100)print(result)# >>> 执行结果如下:# >>> Traceback (most recent call last):# >>> File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 21, in # >>> 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 eresult = 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 # >>> 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 = messagedef test(): raise NewError('这是一个自定义异常')try: test()except NewError as e: print(e) # >>> 执行结果如下:# >>> 这是一个自定义异常
接下来 我们自定义一个检查 name 传参的异常,然后进行校验
class CheckNameError(Exception): def __init__(self, message): self.message = messagedef check_name(name): if name == 'Neo': raise CheckNameError('\'Neo\'的名字不可以作为传参参数') return nametry: check_name('Neo')except CheckNameError as e: print(e) # >>> 执行结果如下:# >>> Neo'的名字不可以作为传参参数 # 尝试一下如果不使用我们 try 捕获我们的自定义异常试试class CheckNameError(Exception): def __init__(self, message): self.message = messagedef check_name(name): if name == 'Neo': raise CheckNameError('\'Neo\'的名字不可以作为传参参数') return namecheck_name('Neo')# >>> 执行结果如下:# >>> __main__.CheckNameError: 'Neo'的名字不可以作为传参参数
总结
该章节我们主要学习如何自定义抛出一个异常,以及如何自动定义一个异常类型。
在工作中,定义一个符合业务场景的异常类型,可以更适合我们的开发与错误显示。