day 25 异常处理

article/2025/7/14 20:52:55

异常处理机制

Python 的异常处理机制赋予程序强大的容错能力。当程序在运行时遇到意外情况(即异常),它不会直接崩溃,而是可以被设计成优雅地处理错误,或继续执行后续逻辑,或按可控方式结束。

在异常发生时,Python 会创建一个异常对象 (exception object),通常是Exception类的子类实例。不同类型的异常对应不同子类,像除零操作会引发ZeroDivisionError异常对象,文件读取失败会产生FileNotFoundError异常对象。

1、try-except-else-finally语句

  • try 块:包含可能触发异常的代码。程序会先尝试执行try块内的代码。例如,进行文件读取操作时,文件可能不存在,就可将文件读取代码置于try块中。
  • except 块:若try块中的代码引发特定类型的异常(或未指定类型时的任何异常),则执行该块代码。捕获异常时,最好指定具体异常类型,这样能针对性处理不同错误。
  • else 块(可选):当try块中的代码未发生任何异常时,执行此块代码。它用于分离主要操作与操作成功后的后续步骤,让try块更专注于可能出错部分。
  • finally 块(可选):无论try块中是否发生异常,此块代码总会执行。常被用于资源清理,如关闭文件、释放数据库连接等。
    • 模型训练状态记录:模型训练可能非常耗时,如果中途因为各种原因(如内存溢出 OOM、手动中断、硬件故障)停止,希望记录下中断的状态,方便后续恢复。
    • 全局状态恢复:恢复全局状态或配置,如果程序在运行过程中修改了全局变量或配置文件,在异常处理结束后,需要恢复到之前的状态或配置。
    • 数据库连接关闭:关闭数据库连接,防止资源泄漏。
    • 计算资源释放:确保计算资源在使用完毕后被释放,供其他进程或任务使用。
    • 资源保存与文件关闭:无论训练成功、失败还是中途被打断,都确保日志文件被正确关闭,避免数据丢失或文件损坏。例如,使用with语句来自动管理文件资源(with open语句),with语句本身就隐式地使用了类似finally的机制。

与 if - elif - else 结构不同,if - elif - else 只有一个代码块会执行,而try - except - else中,try成功则 try块与else块都执行,try失败则执行try块出错前代码及匹配的except块代码(else块不执行)。

2、一些异常报错类型

SyntaxError(语法错误)

原因:代码不符合 Python 的语法规则,解释器在尝试解析代码时就会失败。这种错误在程序运行之前就会被检测到。

示例

print("--- 1. SyntaxError ---")
# 示例 a: 缺少冒号
# def my_function()
#     print("Hello")# 示例 b: 非法表达式
# x = 5 +
# print(x)# 请在演示时逐个取消注释并运行,观察错误

NameError(名称错误)

原因:尝试使用一个未被定义的变量、函数或对象的名称。

示例

# 示例 a: 变量未定义
# print(some_undefined_variable)

TypeError(类型错误)

原因:对一个不支持该操作的数据类型执行了某个操作或函数。

示例

# print("Age: " + 25) # 字符串和整数
# my_number = 10
# my_number() # 尝试像函数一样调用一个整数

ValueError(值错误)

原因:函数接收到的参数类型正确,但其值不合适或无效。

示例

# my_string = "12.34.56"
# number = float(my_string) # '12.34.56' 不是一个有效的浮点数表示

IndexError(索引错误)

原因:尝试访问序列(如列表、元组、字符串)中一个不存在的索引。

示例

# data = ("apple", "banana")
# print(data[2])

KeyError(键错误)

原因:尝试访问字典中一个不存在的键。

示例

# student_grades = {"math": 90, "science": 85}
# print(student_grades["history"])

AttributeError(属性错误)

原因:尝试访问一个对象没有的属性或方法。

示例

# 示例a
# a_string = "hello"
# print(a_string.length) # 字符串长度用 len(a_string),不是 .length 属性# 示例b
# import numpy as np
# arr = np.array([1,2,3])
# print(arr.non_existent_attribute)

ZeroDivisionError(除零错误)

原因:尝试将一个数字除以零。

示例:

# result = 10 / 0
# result

FileNotFoundError(文件未找到错误)

原因:尝试打开一个不存在的文件(通常是在读模式下),或者路径不正确。

示例:

# import pandas as pd
# data = pd.read_csv("hh.csv")

ModuleNotFoundError(导入错误)

原因:尝试导入一个不存在的模块,或者模块存在但其中的特定名称找不到,Python 的模块加载器找不到这个模块。此时通常需要安装对应的库;如果是自定义的模块,则需配置好对应的路径。

# import hhh

当代码出现这类错误时,程序会立即停止执行,并打印出一个 “traceback”(回溯信息)。错误追溯信息是按照函数调用的顺序倒序排列的,以帮助开发者定位错误发生的位置。“most recent call last” 之后会列出最近调用的函数,然后逐步回溯到最初调用的函数。内容包含:

  • 错误类型(例如,NameError, TypeError)
  • 错误发生的文件名和行号
  • 导致错误的那行代码
  • 错误的简要描述

示例代码

print("--- try - except - else 示例 ---")def safe_divide(a, b):print(f"\n尝试计算 {a} / {b}")try:result = a / bexcept ZeroDivisionError:print("错误:除数不能为零!")return None # 或者其他表示失败的值except TypeError:print("错误:输入必须是数字!")return Noneelse:# 只有当try块中的a / b成功执行时,这里才会执行print("除法运算成功!")print(f"结果是: {result}")# 可以在这里进行基于成功结果的进一步操作print(f"结果的两倍是: {result * 2}")return result# 测试用例
safe_divide(10, 2)  # 成功
safe_divide(10, 0)  # ZeroDivisionError
safe_divide("10", 2) # TypeError (如果我们不先做类型转换的话)
safe_divide(20, "abc") # TypeError

@浙大疏锦行


http://www.hkcw.cn/article/bgHWEWbKYO.shtml

相关文章

智能流体仿真软件AICFD 2025R1新版本功能介绍

智能流体仿真软件AICFD是天洑软件自主研发的一款通用型智能热流体仿真工具,其核心代码拥有完全自主知识产权。该软件在业界率先引入人工智能技术,高效解决工业级流动、传热、多相流、噪声及燃烧等复杂仿真问题。 图1 AICFD软件界面 一、版本更新介绍 A…

数据结构之队列:原理与应用

一、基本原理 队列是一种特殊的线性表队列是一个有序表(可以用数组或链表实现)遵循“先来先服务”的原则,它只允许在表的前端(队头)进行删除操作,在表的后端(队尾)进行插入操作 (一) 核心操作 入队&…

windows下安装docker、dify、ollama

一、docker安装 镜像源配置 {"builder": {"gc": {"defaultKeepStorage": "10GB","enabled": true}},"experimental": true,"registry-mirrors": ["https://docker.m.daocloud.io","ht…

mysql隐式转换会造成索引失效的原因

现在我们看一个例子 比如现在我有一张表叫做test 涉及的字段有id code name age address id 是int数值类型 code 是varchar字符串类型 name 是varchar字符串类型 age是int 数值类型 address是varchar 字符串类型 创建语句: CREATE TABLE test ( id INT …

鲲鹏Arm+麒麟V10,国产化信创 K8s 离线部署保姆级教程

Rainbond V6 国产化部署教程,针对鲲鹏 CPU 麒麟 V10 的离线环境,手把手教你从环境准备到应用上线,所有依赖包提前打包好,步骤写成傻瓜式操作指南。别说技术团队了,照着文档一步步来,让你领导来都能独立完成…

Python训练营---Day40

知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业:仔细学习下测试和训练代码…

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下

前五道题&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09;之 【连接】部分 上 题目&#xff1a;577. 员工奖金 题解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…

C++八股 —— 手撕线程池

文章目录 一、背景二、线程池实现1. 任务队列和工作线程2. 构造和析构函数3. 添加任务函数4. 完整代码 三、阻塞队列实现1. 基础队列2. 升级版队列 四、测试代码五、相关问题六、其他实现方式 来自&#xff1a;华为C一面&#xff1a;手撕线程池_哔哩哔哩_bilibili 华为海思&am…

半导体厂房设计建造流程、方案和技术要点-江苏泊苏系统集成有限公司

半导体厂房设计建造流程、方案和技术要点-江苏泊苏系统集成有限公司 半导体厂房的设计建造是一项高度复杂、专业性极强的系统工程&#xff0c;涉及洁净室、微振动控制、电磁屏蔽、特殊气体/化学品管理等关键技术。 一、设计建造流程&#xff1a; 1.需求定义与可行性分析 &a…

gitLab 切换中文模式

点击【头像】--选择settings 选择【language】,选择中文&#xff0c;点击【保存】即可。

Redis 常用数据结构详解与实战应用

在当今互联网高速发展的时代&#xff0c;数据的存储和处理效率至关重要。Redis 作为一款高性能的内存数据库&#xff0c;凭借其丰富的数据结构和出色的性能&#xff0c;成为了众多开发者的首选。本文将深入探讨 Redis 常用的数据结构&#xff0c;并结合实际应用场景&#xff0c…

leetcode2221. 数组的三角和-medium

1 题目&#xff1a;数组的三角和 官方标定难度&#xff1a;中 给你一个下标从 0 开始的整数数组 nums &#xff0c;其中 nums[i] 是 0 到 9 之间&#xff08;两者都包含&#xff09;的一个数字。 nums 的 三角和 是执行以下操作以后最后剩下元素的值&#xff1a; nums 初始…

PPIO × AstrBot:多平台接入聊天机器人,开启高效协同 | 教程

在消息平台接入专属聊天机器人&#xff0c;能快速生成精准答案&#xff0c;与项目管理、CRM等系统集成后&#xff0c;机器人还能根据任务进展自动建群、推送进度提醒&#xff0c;并精准相关人员&#xff0c;实现信息的高效传递。 AstrBot 是一个多平台聊天机器人及开发框架&…

江科大SPI串行外设接口hal库实现

hal库相关函数 初始化结构体 typedef struct {uint32_t Mode; /*SPI模式*/uint32_t Direction; /*SPI方向*/uint32_t DataSize; /*数据大小*/uint32_t CLKPolarity; /*时钟默认极性控制CPOL*/uint32_t CLKPhase; /*…

【笔记】Suna 部署之获取 OpenAI API key

#工作记录 API Platform | OpenAI 一、注册或登录 OpenAI 账号 访问 OpenAI 官方网站&#xff08;platform.openai.com &#xff09;。若已有 ChatGPT 账号&#xff0c;可直接使用该账号登录。若无账号&#xff0c;点击注册&#xff08;Sign Up&#xff09;&#xff0c;填写有…

Java八股文——Java基础「概念篇」

参考小林Coding和Java Guide 说一下Java的特点 平台无关性&#xff1a;“Write Once, Run Anywhere”其最大的特点之一。Java编译器将源代码编译成字节码&#xff0c;该字节码可以在任何安装了JVM的系统上运行。面向对象&#xff1a;Java是一门严格的面向对象编程语言&#xf…

NHANES指标推荐:CQI

文章题目&#xff1a;The impact of carbohydrate quality index on menopausal symptoms and quality of life in postmenopausal women 中文标题&#xff1a;碳水化合物质量指数对绝经后妇女更年期症状和生活质量的影响 发表杂志&#xff1a;BMC Womens Health 影响因子&…

91.评论日记

2025年5月30日20:27:06 AI画减速器图纸&#xff1f; 呜呜为什么读到机械博士毕业了才有啊 | 新迪数字2025新品发布会 | AI工业软件 | 三维CAD | 国产自主_哔哩哔哩_bilibili

循环神经网络(RNN)全面教程:从原理到实践

循环神经网络(RNN)全面教程&#xff1a;从原理到实践 引言 循环神经网络(Recurrent Neural Network, RNN)是处理序列数据的经典神经网络架构&#xff0c;在自然语言处理、语音识别、时间序列预测等领域有着广泛应用。本文将系统介绍RNN的核心概念、常见变体、实现方法以及实际…

OrCAD X Capture CIS 设计小诀窍第二季 | 10. 如何自动将 270° 放置的网络名称修正为 90°

背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;经常需要统一原理图的格式&#xff0c;从而保证原理图的美观和统一。而通过把所有270放置的网络名称修正为90可以避免因网络名称放置的方向不一致而造成混淆&#xff0c;比如6和9。但如果依靠设计师手动进行修改&#x…