Python异常处理机制详解:语法错误、try-except-finally及自定义异常
本文深入解析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 错误与异常的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









