6-3.Python 异常处理 - 异常处理进阶(else 块与 finally 块、异常传递、自定义异常)

一、else 块与 finally 块

1、基本介绍
  1. else 块表示如果没有异常要执行的代码
python 复制代码
try:
    【可能发生异常的代码】
except:
    【捕获异常后执行的代码】
else:
    【如果没有异常要执行的代码】
  1. finally 块表示不管有没有异常都要执行的代码
python 复制代码
try:
    【可能发生异常的代码】
except:
    【捕获异常后执行的代码】
finally:
    【不管有没有异常都要执行的代码】
  1. else 块和 finally 块一起使用
python 复制代码
try:
    【可能发生异常的代码】
except:
    【捕获异常后执行的代码】
else:
    【如果没有异常要执行的代码】
finally:
    【不管有没有异常都要执行的代码】
2、演示
  1. else 块
python 复制代码
# test1
try:
    result = 1 / 0
except:
    print("test1 发生异常")
else:
    print("test1 没有发生异常,执行这行代码")

# test2
try:
    result = 1 * 0
except:
    print("test2 发生异常")
else:
    print("test2 没有发生异常,执行这行代码")
复制代码
# 输出结果

test1 发生异常
test2 没有发生异常,执行这行代码
  1. finally 块
python 复制代码
# test1
try:
    result = 1 / 0
except:
    print("test1 发生异常")
finally:
    print("test1 不管有没有发生异常,都执行这行代码")

# test2
try:
    result = 1 * 0
except:
    print("test2 发生异常")
finally:
    print("test2 不管有没有发生异常,都执行这行代码")
复制代码
# 输出结果

test1 发生异常
test1 不管有没有发生异常,都执行这行代码
test2 不管有没有发生异常,都执行这行代码
  1. else 块和 finally 块一起使用
python 复制代码
# test1
try:
    result = 1 / 0
except:
    print("test1 发生异常")
else:
    print("test1 没有发生异常,执行这行代码")
finally:
    print("test1 不管有没有发生异常,都执行这行代码")

# test2
try:
    result = 1 * 0
except:
    print("test2 发生异常")
else:
    print("test2 没有发生异常,执行这行代码")
finally:
    print("test2 不管有没有发生异常,都执行这行代码")
复制代码
# 输出结果

test1 发生异常
test1 不管有没有发生异常,都执行这行代码
test2 没有发生异常,执行这行代码
test2 不管有没有发生异常,都执行这行代码

二、异常传递

1、基本介绍
  1. 异常是具有传递性的,当一个传递的异常没有(在各个函数中)被捕获时,一直传递出去,程序就会报错

  2. 利用异常传递,可以在最外层设置异常捕获,这样可以确保所有的异常都会被捕获,程序不会报错

2、演示
python 复制代码
def fn1():  # 异常在 fn1() 中没有被捕获
    print("fn1 开始")
    1 / 0
    print("fn1 结束")


def fn2():  # 异常在 fn2() 中没有被捕获
    print("fn2 开始")
    fn1()
    print("fn2 结束")


# 异常在这里被捕获
try:
    fn2()
except ZeroDivisionError as e:
    print(e)
复制代码
# 输出结果

fn2 开始
fn1 开始
division by zero

三、自定义异常

1、基本介绍
  1. 自定义异常通过继承内置的 Exception 类来实现的

  2. 自定义异常允许定义具有特定行为的错误类型,用于处理特定于应用程序的错误

2、演示
python 复制代码
class MyCustomError(Exception):
    def __init__(self, message, error_code):
        self.message = message
        self.error_code = error_code

    def __str__(self):
        return f"[Error {self.error_code}]: {self.message}"


def check(value):
    if value < 0:
        raise MyCustomError("输入值不合法", 400)


try:
    check(-10)
except MyCustomError as e:
    print(e)
复制代码
# 输出结果

[Error 400]: 输入值不合法
相关推荐
陶醉的松鼠1 小时前
前端容易忽略的 debugger 调试技巧
前端
额额额对了1 小时前
【项目实战】从IMX6ULL环境监测到N647 AI视觉加速
linux·开发语言·嵌入式硬件
龙九山1 小时前
我的 10 个 npm 插件,差点被 AI 判了死刑
前端·开源
深入云栈1 小时前
Netty 4.2.x 源码深度解析 (二十一):Pipeline 事件传播 —— Inbound 与 Outbound 的双向流转
java·后端·架构
deli0071 小时前
键盘按键测试:按下就点亮,keydown 延迟精确到 1 毫秒
前端
Elastic 中国社区官方博客1 小时前
Elastic 重大事件功能如何将 100 条日志样本转化为检测规则
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎
adinnet20261 小时前
持续智能问数:多轮对话状态管理、下钻钻取与经营驾驶舱的演进
javascript·数据库·人工智能
FYKJ_20101 小时前
springboot高考志愿填报推荐系统14332-计算机课程设计、毕业设计
javascript·spring boot·python·架构·django·课程设计·高考
卷无止境1 小时前
长篇写作 Skill 横向盘点:从单文件指令到多智能体流水线
后端·python