Python嵌套try...except使用详解与异常处理技巧
本文详解Python中try...except的嵌套使用机制。通过示例展示raise抛出异常后代码执行流程,以及外层try如何捕获内层异常。同时介绍自定义异常类的继承方式,并对比Exception万能捕获、traceback模块和sys模块三种异常查看方法,帮助开发者掌握Python异常处理的核心技巧。
引言
在Python编程中,try…except…结构常用于捕获运行时异常,而raise关键字用于主动抛出异常。然而,当遇到多层嵌套的try…except…结构时,异常是如何逐层传递并被捕获的,这往往是初学者容易混淆的地方。
前提
抛出异常
当程序执行到raise语句以抛出错误时,该语句之后的代码将不再执行,程序控制权立即转移到最近的匹配异常处理块。
def func():
print("hello")
raise Exception("出现了错误")
print("world")
func()
打印的错误堆栈
如果通过except子句成功抓取了错误,程序行为类似于执行了if...else分支,即不会中断整个脚本的执行,而是继续处理后续逻辑。
def func():
try:
print("hello")
raise Exception("出现了错误")
except Exception as why:
print(why)
print("world")
func()
自定义异常
创建自定义异常类时,必须继承内置的异常类或第三方框架提供的异常基类。这种继承关系确保了自定义异常能够被标准的异常处理机制所识别。
class MyError(Exception):
pass
def say_hello(str):
if str != "hello":
raise MyError("传入的字符串不是hello")
print("hello")
say_hello("world")
异常对象
- Exception是所有内置异常的基类,它能够捕获系统中发生的绝大多数异常类型。
- 在except子句中,使用as关键字后跟随的变量即为捕获到的异常对象。该对象是异常类实例化后的结果,包含了错误的详细信息。
多重try
在嵌套的try...except...结构中,内层代码块通过raise抛出的异常,会被外层对应的try...except...块捕获并处理,从而实现异常的逐层向上冒泡。
补充:捕获异常的小方法
方法一:捕获所有异常
a=10
b=0
try:
print (a/b)
except Exception as e:
print(Exception,":",e)
finally:
print ("always excute")
运行:
<class 'Exception'> : division by zero always excute
方法二:采用traceback模块查看异常
import traceback
try:
print ('here1:',5/2)
print ('here2:',10/5)
print ('here3:',10/0)
except Exception as e:
traceback.print_exc()
运行:
here1: 2.5 here2: 2.0 Traceback (most recent call last): File "/Users/lilong/Desktop/online_release/try_except_use.py", line 59, in <module> print ('here3:',10/0) ZeroDivisionError: division by zero
方法三:采用sys模块回溯最后的异常
import sys
try:
print ('here1:',5/2)
print ('here2:',10/5)
print ('here3:',10/0)
except Exception as e:
info=sys.exc_info()
print (info[0],":",info[1])
运行:
here1: 2.5 here2: 2.0 <class 'ZeroDivisionError'> : division by zero
注意:万能异常Exception
当被检测的代码块可能抛出多种类型的异常,且希望用同一种逻辑处理所有情况时,可以使用Exception。除非需要对特定异常类型进行特殊处理,否则建议使用Exception进行通用捕获。
总结
到此这篇关于python嵌套try...except如何使用的文章就介绍到这了,更多相关python嵌套try...except使用内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













