这里介绍Python中的异常

自定义异常
Python中异常的基类为BaseException。其常见子类有:SystemExit、KeyboardInterrupt、Exception等。其中,Exception是常规异常的基类。当我们自定义异常类时,建议直接或间接继承Exception类。而不是直接继承BaseException
# 自定义异常类:直接继承 Exception
class BusinessException(Exception):
pass
# 自定义异常类:间接继承 Exception
class RuntimeException(ZeroDivisionError):
pass
捕获异常
可以通过except子句捕获指定异常。具体地,可以在一个except子句中使用元组指定多个异常;也可以同时使用多个excpet子句
print("-------------- 捕获异常 -------------")
try:
num = 5/0
except ZeroDivisionError:
print("[#1] 除数不能为0")
# 1. 可以在一个except语句中使用元组指定多个异常
# 2. 可使用多个excpet子句
print("nn-------------- 捕获多个异常 -------------")
for i in range(0,2) :
try:
if( i==1 ):
i = "aaron"
answer = 5 / i
except (ZeroDivisionError, SyntaxError) as ex:
# 可使用as语句将异常实例关联到变量上
print("Error: 除数为0, ex:", ex)
except TypeError:
print("发生语法错误")
except :
# 当excpet子句未指定异常类型时,其类型为BaseException异常基类,可捕获所有异常
print("发生异常")

try-except的finally子句: 无论try中发生任何异常,finally中的代码都会被执行。即使try中发生的异常未被捕获,finally中代码在全部执行完成后,会再次重新抛出相应异常

抛异常
1. 基本语法
可通过raise子句来抛出异常
# 抛出异常
raise AttributeError("用户姓名重复")

2. 异常捕获后继续抛该异常
捕获异常后,可直接使用raise,其会继续抛出当前捕获的异常
try:
num = 5/0
except ZeroDivisionError:
print("[#1] 除数不能为0")
# 捕获异常后,可直接使用raise,其会继续抛出当前捕获的异常
raise

3. 异常捕获后抛其他异常
捕获异常后,可使用raise抛出其他的异常。此时,导致进入except子句的异常将被作为异常上下文存储起来,并出现在最终的错误消息中
try:
num = 5/0
except ZeroDivisionError:
print("[#2] 除数不能为0")
# 捕获异常后,可使用raise抛出别的异常
# 此时,导致进入except子句的异常将被作为异常上下文存储起来,并出现在最终的错误消息中
raise OSError

4. 异常捕获后抛其他异常,并重设异常上下文
捕获异常后,可使用raise抛出别的异常。同时,使用raise … from … 语句提供指定的异常上下文
try:
num = 5/0
except ZeroDivisionError:
print("[#3] 除数不能为0")
# 捕获异常后,可使用raise抛出别的异常
# 同时,使用raise ... from ... 语句提供指定的异常上下文
raise OSError from SyntaxError

5. 异常捕获后抛其他异常,并清除异常上下文
捕获异常后,可使用raise抛出别的异常。同时,使用raise … from None 语句 清除 异常上下文
try:
num = 5/0
except ZeroDivisionError:
print("[#4] 除数不能为0")
# 捕获异常后,可使用raise抛出别的异常
# 同时,使用raise ... from None 语句 清除 异常上下文
raise OSError from None

其他特性
else子句
try-except支持else子句。仅当try代码块成功执行,未抛出异常,才会执行else代码块
for i in range(0,3) :
try:
print(f"i --->>> {i}")
answer = 5 / i
except ZeroDivisionError:
print("[Error]: 除数i是0")
else:
print("answer:", answer)

try-with语句
try-with语句封装了try-except-finally 范式。使得对于需要关闭的资源,不再需要显式地通过finllay子句进行关闭
# as 子句是可选的,用于关联变量
with open("main.txt") as file1, open("readme.txt") as file2:
src = file1.read(60)
print(f"文件file1是否被关闭: {file1.closed}")
print(f"文件file2是否被关闭: {file2.closed}")

参考文献
-
Python编程·第3版:从入门到实践 Eric Matthes著 -
Python基础教程·第3版 Magnus Lie Hetland著 -
流畅的Python·第1版 Luciano Ramalho著
原文始发于微信公众号(青灯抽丝):Python之异常
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/289092.html