Python自定义异常捕获与处理机制详解

星野
星野
发布时间:2026-10-14 | 5人浏览过
原创

本文详解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如何自定义捕获错误的介绍已完成,更多相关方法请查阅本站历史文章或继续浏览后续内容,感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表