Python异常处理机制详解:语法错误、try-except-finally及自定义异常

桃夭
桃夭
发布时间:2026-10-14 | 6人浏览过
原创

本文深入解析Python中的错误与异常处理机制。涵盖语法错误与运行时异常的区别,详细讲解try-except-else-finally的执行流程及嵌套处理。通过代码示例演示如何捕获多重异常、使用finally确保资源清理,以及利用raise和assert语句主动触发异常。适用于希望掌握Python健壮性编程的开发者。

一、语法错误

异常:大多数情况下,程序运行时出现的异常不会被自动处理,而是以错误信息的形式直接展示给用户。

二、异常处理


while True:
    try:
        x = int(input("请输入一个错误:"))
        break
    except ValueError:
        print("不是有效数字,再试一遍")

try 语句的执行顺序如下:

  • 首先执行 try 语句块中的代码。若在此过程中未发生任何异常,则直接跳过所有 except 子句,执行完 try 块后结束该语句。
  • 若在执行 try 子句期间发生异常,try 块中剩余未执行的代码将被忽略。
  • 若发生的异常类型与某个 except 子句指定的名称相匹配,则该 except 子句将被执行以处理该异常。
  • 如果发生的异常未与任何 except 子句匹配,该异常会向上传递至外层嵌套的 try 语句中继续查找匹配项(支持 try 嵌套 try)。

一个 except 子句可以同时处理多种异常类型,只需将这些类型放入括号中组成元组即可,例如:


except (RuntimeError, TypeError, NameError):
        pass

最后一个 except 子句可以省略异常名称,此时它充当通配符角色,用于捕获所有未被前面子句处理的异常。这种方法常用于打印错误信息后重新抛出异常。


except:
    print("作为最后一个,我能捕获所有之前没有捕获的异常")

try-except 语句还包含一个可选的 else 子句,该子句必须置于所有 except 子句之后。当 try 子句成功执行且未发生任何异常时,else 子句将被执行。例如:


else:
    print("else在正常情况下会被执行")

使用 else 子句比将全部代码放入 try 块更为推荐,因为这样可以避免意外发生的、且未被 except 捕获的异常。

异常处理机制同样适用于处理子句中调用的函数(包括间接调用的函数)所抛出的异常。例如:

在 except...as err 中,err 变量用于绑定错误类型,as 关键字允许获取具体的异常对象。


def this_fails():
    x = 1 / 0

try:
    this_fails()
except ZeroDivisionError as err:
    print('Handling run-time error:', err)

#结果:Handling run-time error: division by zero

finally 子句中的代码无论是否发生异常,均会被执行。


finally:
    print("finally在任何情况写都会被执行")

2.1、try-finally语句

语法结构如下:

try: 可能触发异常的语句 finally: 最终语句

说明:在 try-finally 结构中,finally 子句不可省略,且该结构中不允许存在 except 子句。

作用:用于执行必须完成的操作,无论 try 块中是否发生异常,finally 子句都会执行。

注意:try-finally 语句不会改变程序的正常或异常状态,它仅确保清理代码的执行。

2.2、raise 语句

作用:主动触发一个错误,使程序进入异常状态。 语法:raise 异常类型 或 raise 异常对象


1 # #raise 语句
 2 def make_except():
 3     print("开始...")
 4     # raise ZeroDivisionError  # 手动发生一个错误通知
 5     e = ZeroDivisionError("被零除啦!!!!!")
 6     raise e  # 触发e绑定的错误,进入异常状态
 7     print("结束")
 8 
 9 try:
10     make_except()
11     print("make_except调用完毕!")
12 except ZeroDivisionError as err:
13     print('出现了被零除的错误,已处理并转为正常状态!')
14     print('err 绑定的对象是:', err)
15 
16 #开始...
17 #出现了被零除的错误,已处理并转为正常状态!
18 #err 绑定的对象是: 被零除啦!!!!!

2.3、assert 断言语句

语法:assert 真值表达式 , 错误信息(通常为字符串)

作用:当真值表达式为假时,主动抛出异常;若真值表达式为真,则断言语句不产生任何效果。


assert b==1            # 也可以没有 异常说明
assert len(lists) >=5,'列表元素个数小于5'        # 当len(lists)<5时,主动发出异常
assert b==1,'2不等于1'                        # 当b不等于1时,主动发出异常,并提示异常

若出现使用 print() 函数打印出内存地址的情况,说明你输出的是打印函数名、模块名或类名,需要使用相应函数从内存中提取实际值。

三、小结

接收错误消息: try-except 做必须要处理的事情的语句: try-finally 发错误消息的语句: raise 语句 assert 语句

以上就是浅谈python中的错误与异常的详细内容,更多关于python 错误与异常的资料请关注本站其它相关文章!

本站声明

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

Python 相关产品和应用

全部下载

专题列表