Python之异常

这里介绍Python中的异常

Python之异常
abstract.png

自定义异常

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("发生异常")
Python之异常
figure 1.png

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

Python之异常
figure 2.png

抛异常

1. 基本语法

可通过raise子句来抛出异常

# 抛出异常
raise AttributeError("用户姓名重复")
Python之异常
figure 3.png

2. 异常捕获后继续抛该异常

捕获异常后,可直接使用raise,其会继续抛出当前捕获的异常

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

3. 异常捕获后抛其他异常

捕获异常后,可使用raise抛出其他的异常。此时,导致进入except子句的异常将被作为异常上下文存储起来,并出现在最终的错误消息中

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

4. 异常捕获后抛其他异常,并重设异常上下文

捕获异常后,可使用raise抛出别的异常。同时,使用raise … from … 语句提供指定的异常上下文

try:
    num  = 5/0
except ZeroDivisionError:
    print("[#3] 除数不能为0")
    # 捕获异常后,可使用raise抛出别的异常
    # 同时,使用raise ... from ... 语句提供指定的异常上下文
    raise OSError from SyntaxError
Python之异常
figure 6.png

5. 异常捕获后抛其他异常,并清除异常上下文

捕获异常后,可使用raise抛出别的异常。同时,使用raise … from None 语句 清除 异常上下文

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

其他特性

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)
Python之异常
figure 8.png

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之异常
figure 9.png

参考文献

  1. Python编程·第3版:从入门到实践 Eric Matthes著
  2. Python基础教程·第3版 Magnus Lie Hetland著
  3. 流畅的Python·第1版 Luciano Ramalho著

原文始发于微信公众号(青灯抽丝):Python之异常

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/289092.html

(0)
土豆大侠的头像土豆大侠

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!