Python自定义异常捕获与处理机制详解
本文详解Python中自定义异常的捕获与处理。涵盖raise语句抛出异常、try-except-else-finally的标准执行顺序及可选性,以及通过继承Exception类创建自定义异常的方法。重点解析异常类的继承关系对捕获范围的影响,确保代码健壮性。
Python异常捕捉基础与流程控制
在Python中,异常捕捉是程序健壮性的关键。
try:
XXXXX1
raise Exception(“xxxxx2”)
except (Exception1,Exception2,……):
xxxx3
else:
xxxxx4
finally:
xxxxxxx5
首先,raise语句允许开发者自定义报错信息,如前文示例所示。
需要注意的是,一旦执行raise语句抛出异常,其后的代码将不再执行,因为控制流会立即跳转至相应的异常捕捉模块。
其次,except语句具有灵活性,既可以在一个except块中捕获多个异常类型,也可以使用多个except语句分别捕捉不同异常并执行不同的处理逻辑。
此外,如果except语句所指定的异常并未发生,则except内部的代码块不会被执行,程序将转而执行else子句中的代码。
关于try、except、else和finally块的排列顺序,必须严格遵循try -> except X -> except -> else -> finally的规则。这意味着所有的except子句必须位于else和finally之前,而else(若存在)必须位于finally之前,且带有特定异常类型的except X需放在通用except之前,否则将引发语法错误。
其中,else和finally子句均为可选部分,可根据实际需求决定是否添加。
特别强调,else语句的存在必须以存在except X或普通except语句为前提。如果在没有except子句的try代码块中直接使用else,Python解释器会抛出语法错误。
自定义异常类的构建与继承关系
接下来探讨异常参数的输出与自定义异常的构建。
try:
testRaise()
except PreconditionsException as e: #python3的写法,必须用as
print (e)
要定义自定义异常,只需创建一个继承自父类Exception的新类,并在该类中重写__init__方法以初始化错误信息。
class DatabaseException(Exception):
def __init__(self,err='数据库错误'):
Exception.__init__(self,err)
class PreconditionsException(DatabaseException):
def __init__(self,err='PreconditionsErr'):
DatabaseException.__init__(self,err)
def testRaise():
raise PreconditionsException()
try:
testRaise()
except PreconditionsException as e:
print (e)
值得注意的是,PreconditionsException是DatabaseException的子类,这构成了异常处理的继承层级。
因此,当使用raise抛出PreconditionsException时,既可以使用PreconditionsException进行捕捉,也可以使用其父类DatabaseException进行捕捉,因为子类异常会被父类捕获机制覆盖。
然而,逻辑是单向的:如果raise抛出的是父类DatabaseException,则使用子类PreconditionsException无法捕捉该异常,因为子类无法捕获父类实例。
自定义异常处理实例演示
最后,通过具体实例来补充说明上述概念的实际应用。
以下是Python中自定义异常、捕获及处理异常的完整示例代码。
def set_inf(name,age):
if not 0 < age < 120:
raise ValueError('超出范围')
else:
print('%s is %s years old' % (name,age))
def set_inf2(name,age):
assert 0 < age < 120,'超出范围'
print('%s is %s years old' % (name,age))
if __name__ == '__main__':
try:
set_inf('bob',200)
except ValueError as e:
print('无效值:',e)
set_inf2('bob',200)
至此,关于Python如何自定义捕获错误的介绍已完成,更多相关方法请查阅本站历史文章或继续浏览后续内容,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













