在本文中,我们将尝试通过示例介绍如何在 Python 中自定义异常。
例子:
class CustomError(Exception):
pass
raise CustomError("Example of Custom Exceptions in Python")
Output: CustomError: Example of Custom Exceptions in Python
当代码出错时,Python会抛出错误和异常,这可能会导致程序突然停止。Python 还借助try-except提供了异常处理方法。一些最常见的标准异常包括 IndexError、ImportError、IOError、ZeroDivisionError、TypeError 和 FileNotFoundError。
Python 中用户定义的异常
异常需要直接或间接从 Exception 类派生。虽然不是强制性的,但大多数异常都被命名为以“Error”结尾的名称,类似于 python 中标准异常的命名。例如:
# 一个用于创建用户自定义异常的Python程序
# MyError类继承自超类Exception
class MyError(Exception):
# 构造函数或初始化器
def __init__(self, value):
self.value = value
# __str__用于打印异常的值
def __str__(self):
return(repr(self.value))
try:
raise(MyError(3*2))
# 异常的值存储在error中
except MyError as error:
print('发生了新的异常:', error.value)
输出:
发生了新的异常:6
说明:在这个程序中,我们定义了一个名为MyError的自定义异常类,它继承自Python的Exception超类。我们在构造函数init中接受异常的值,并在str方法中定义了打印异常值的方式。然后,我们在try块中使用raise语句引发了MyError异常,并传递了一个值。在except块中,我们捕获了MyError异常并打印了异常的值。这允许我们创建自定义的异常类,并根据需要引发和捕获它们。
自定义异常类
要了解有关 Exception 类的更多信息,请运行以下代码:
help(Exception)
help(Exception)命令用于获取有关Python中的Exception类的帮助文档。这将提供关于Exception类及其方法和属性的信息。
示例 1:具有多重继承的用户定义类
在下面的文章中,我们创建了一个名为“Error”的类,该类派生自 Exception 类。这个基类被各种用户定义的类继承,用于处理不同类型的python引发异常和消息。
# 定义Python用户自定义异常
class Error(Exception):
"""其他异常的基类"""
pass
class zerodivision(Error):
"""当输入值为零时引发异常"""
pass
try:
i_num = int(input("请输入一个数字:"))
if i_num == 0:
raise zerodivision
except zerodivision:
print("输入值为零,请重试!")
print()
输出:
请输入一个数字:0
输入值为零,请重试!
示例 2:从超类异常派生错误
当模块需要处理几个不同的错误时,就会创建超类异常。执行此操作的常见方法之一是为该模块定义的异常创建基类。此外,定义了各种子类来为不同的错误条件创建特定的异常类。
# 类Error继承自超类Exception
class Error(Exception):
# Error是Exception的派生类,但是
# 是该模块中异常的基类
pass
class TransitionError(Error):
# 当操作尝试进行不允许的状态转换时引发。
def __init__(self, prev, nex, msg):
self.prev = prev
self.next = nex
# 引发的错误消息保存在msg中
self.msg = msg
try:
raise(TransitionError(2, 3*2, "不允许的操作"))
# 异常的值存储在error中
except TransitionError as error:
print('发生异常:', error.msg)
输出:
发生异常:不允许的操作
如何使用标准异常作为基类?
要使用标准异常作为基类,您只需在定义您的自定义异常类时将其作为基类指定即可。这样,您的自定义异常类将继承标准异常的属性和方法。
# NetworkError继承自RuntimeError
# 而不是Exception
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
try:
raise Networkerror("错误")
except Networkerror as e:
print(e.args)
输出:
('错误')
说明:这段代码定义了一个名为Networkerror的自定义异常类,它继承自内置的RuntimeError异常类而不是Exception类。然后,代码尝试引发Networkerror异常,并在异常处理块中捕获异常并打印异常的参数值。
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/python-user-defined-exceptions/