1. 基本结构

try:# 可能会抛出异常的代码
except SomeException as e:# 捕获并处理异常
else:# 如果 try 中代码没有异常,就执行这里
finally:# 无论是否发生异常,最后都会执行这里

2. 各部分的作用

try

  • 用途:包含可能发生异常的代码段。
  • 如果代码没有异常,则 except 不会被执行,直接进入 else(如果有的话)。
  • 如果有异常,则转到对应的 except

except

  • 用途:捕获并处理异常。
  • 可以写多个 except,匹配不同的异常类型。

示例:

try:x = int("abc")  # 会触发 ValueError
except ValueError:print("捕获到 ValueError")
except TypeError:print("捕获到 TypeError")

else

  • 用途只有当 try 中没有发生任何异常时 才会执行。
  • 常用于把 不需要异常保护的逻辑 放在这里,让 try 中的代码尽量简洁。

示例:

try:result = 10 / 2
except ZeroDivisionError:print("除零错误")
else:print("计算成功,结果是:", result)

运行结果:

计算成功,结果是: 5.0

finally

  • 用途无论是否发生异常,都会执行。
  • 常用于资源释放、文件关闭、锁释放等。

示例:

try:f = open("test.txt", "r")data = f.read()
except FileNotFoundError:print("文件不存在")
else:print("读取成功")
finally:print("执行 finally")if 'f' in locals() and not f.closed:f.close()

3. 执行流程总结

情况tryexceptelsefinally
没有异常执行跳过执行执行
有异常,匹配到执行到异常处中断执行跳过执行
有异常,未匹配到执行到异常处中断不执行不执行执行(然后异常继续向上抛出)

4. 常见用法

(1)多个 except

try:x = int("abc")
except ValueError:print("数值错误")
except Exception as e:print("其他异常:", e)

(2)捕获多个异常

try:x = int("abc")
except (ValueError, TypeError) as e:print("捕获到异常:", e)

(3)用 else 处理后续逻辑

try:num = int("123")
except ValueError:print("转换失败")
else:print("转换成功,结果是:", num)

(4)finally 释放资源

try:f = open("data.txt", "r")data = f.read()
except FileNotFoundError:print("文件没找到")
finally:print("关闭文件")if 'f' in locals() and not f.closed:f.close()

5. 容易踩的坑

  1. finally 中的 return 会覆盖异常
def foo():try:return 1finally:return 2print(foo())  # 输出 2,而不是 1

说明:finally 里的 returnbreakcontinue 都会覆盖 try/except/else 的返回值或异常。

  1. 过度使用 try

    • 最佳实践:只把 可能发生异常的最小代码块 放进 try,不要把一大段逻辑全包进去。

6.常用场景示例

下面 6 个示例覆盖了:

  1. 文件操作
  2. 用户输入
  3. 网络请求
  4. 多异常捕获
  5. 数据库操作
  6. 临时文件清理

示例 1:文件读取(带 finally 关闭资源)

try:f = open("test.txt", "r")data = f.read()
except FileNotFoundError:print("文件不存在")
else:print("文件内容:", data)
finally:if 'f' in locals() and not f.closed:f.close()print("文件已关闭")

应用场景:文件操作时,确保资源一定会被关闭。


示例 2:用户输入校验

try:num = int(input("请输入一个整数: "))
except ValueError:print("输入无效,请输入整数!")
else:print("你输入的整数是:", num)

应用场景:处理用户输入时防止格式错误。


示例 3:网络请求(简化版)

import requeststry:response = requests.get("https://httpbin.org/get")data = response.json()
except requests.RequestException as e:print("请求失败:", e)
else:print("请求成功,返回数据:", data)
finally:print("请求结束")

应用场景:网络请求一定要有异常处理,否则一旦超时或断网就会崩溃。


示例 4:多个异常捕获

try:x = int("abc")  # ValueErrory = 10 / 0      # ZeroDivisionError
except ValueError:print("数值转换错误")
except ZeroDivisionError:print("除零错误")
except Exception as e:print("其他错误:", e)

应用场景:针对不同错误分类处理,更清晰。


示例 5:数据库操作(带 finally 释放连接)

class FakeDB:def connect(self): print("连接数据库")def close(self): print("关闭数据库")def query(self): return [1, 2, 3]db = FakeDB()
try:db.connect()result = db.query()
except Exception as e:print("查询失败:", e)
else:print("查询结果:", result)
finally:db.close()

应用场景:数据库、消息队列、Socket等操作中保证资源一定释放。


示例 6:finally 保证清理临时文件

import ostry:with open("temp.txt", "w") as f:f.write("临时数据")raise RuntimeError("模拟出错")
except RuntimeError as e:print("捕获到异常:", e)
finally:if os.path.exists("temp.txt"):os.remove("temp.txt")print("临时文件已删除")

应用场景:程序中断时确保临时文件、缓存不会遗留。


7. 总结口诀

  • try:放可能出错的代码
  • except:出错就处理
  • else:没出错才执行
  • finally:一定会执行

高级应用内容

高级应用主要涉及:

  1. 异常链:处理后再抛出
  2. 自定义异常:模块化项目常用
  3. 上下文管理器:优雅封装 try/finally
  4. 逻辑分层else 只放成功逻辑
  5. finally 覆盖陷阱:调试必知
  6. contextlib.suppress:优雅忽略异常
  7. 事务回滚:数据库/分布式系统
  8. 多线程异常处理:防止异常丢失
    下面分别举例说明,具体内容如下:

1. 捕获并重新抛出异常(异常链)

有时需要先处理一下,再把异常继续抛给上层:

def process_data(data):try:return int(data)except ValueError as e:print("日志记录:数据转换失败 ->", e)raise   # 重新抛出异常,让上层调用者知道

应用场景:日志记录、错误追踪。


2. 自定义异常类

在工程里,为了更清晰区分错误类型,常会定义自家异常:

class DataFormatError(Exception):passdef load_data(data):if not isinstance(data, dict):raise DataFormatError("数据必须是字典类型")try:load_data("not_dict")
except DataFormatError as e:print("捕获到自定义异常:", e)

应用场景:大型项目中,给模块定义专属错误类型,便于精确捕获。


3. with 上下文管理器的异常处理

上下文管理器的 __exit__ 方法可以接收异常,并决定是否吞掉:

class Demo:def __enter__(self):print("进入上下文")return selfdef __exit__(self, exc_type, exc_val, exc_tb):print("退出上下文")if exc_type:print("捕获异常:", exc_type, exc_val)return True  # 返回 True 表示异常已处理,不会再抛出with Demo():print("运行中...")raise ValueError("测试异常")
print("程序继续执行")

应用场景:数据库事务、文件操作、锁等,结合 try/finally 自动化资源管理。


4. try/except/else 结合逻辑分层

try 只负责可能出错的部分,后续逻辑放到 else,保持结构清晰:

try:f = open("config.json")config = f.read()
except FileNotFoundError:print("配置文件缺失")
else:print("配置文件加载成功")
finally:if 'f' in locals():f.close()

应用场景:避免把无关代码放进 try,提高可读性。


5. finally 中的清理 vs. 异常屏蔽

注意:如果 finally 里有 return/raise,会覆盖原异常:

def test():try:1 / 0except ZeroDivisionError:print("捕获到异常")raisefinally:return "finally 覆盖了异常"print(test())  # 输出 "finally 覆盖了异常"

应用场景:调试时要小心,避免无意中吞掉异常。


6. contextlib.suppress —— 优雅忽略异常

Python 内置的工具类,可以用来代替 try/except/pass

import contextlibwith contextlib.suppress(FileNotFoundError):with open("no_such_file.txt") as f:data = f.read()print("即使文件不存在,程序也能继续运行")

应用场景:当你明确不关心某些异常时,代码更简洁。


7. 异常和事务(数据库/分布式)

很多数据库驱动会在 try/except/finally 中实现事务控制:

try:db.begin()db.insert("users", {"id": 1, "name": "Alice"})db.commit()
except Exception as e:db.rollback()print("事务失败:", e)

应用场景:保证数据一致性。


8. 异常与多线程

在多线程中,子线程的异常不会自动传递到主线程,需要显式捕获:

import threadingdef worker():try:1 / 0except Exception as e:print("子线程异常:", e)t = threading.Thread(target=worker)
t.start()
t.join()

应用场景:多线程/异步编程中异常管理。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96110.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96110.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96110.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冰火岛 Tech 传:Apple Foundation Models 心法解密(下集)

引子 上集说到冰火岛冰屋内,谢逊、张翠山、殷素素三人亲见 “指令(Instructions)” 如何让 AI 脱胎换骨,从木讷报地名的 “愣头青”,变身为文采斐然的 “旅行作家”。 正当素素惊叹这 AI 武学的奇妙时,谢逊却突然神色一凛,指着手腕上用冰屑刻的 “4096” 字样道:“这等…

Qt信号与槽机制全面解析

✨ 1. 核心概念信号与槽是Qt独创的一种对象间通信机制,它使得一个对象的状态变化或事件发生能够自动通知其他对象作出响应,从而实现高度解耦的代码设计。1.1 信号(Signals)定义:信号是由对象在特定事件发生时发出&…

2025年COR SCI2区,基于近似细胞分解的能源高效无人机路径规划问题用于地质灾害监测,深度解析+性能实测

目录1.摘要2.问题描述与数学模型3.能源网格混合元启发式算法4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 本文提出了一种能源高效的无人机路径规划方法(EURP)用于监测分散的地质灾害易发区域,通过建立无人机飞行模式的…

LangChain关于提示词的几种写法

上文中 <---->(可点击移步查阅),我们已经了解到LangChain如何编写调用大模型的一个基本框架, 在编写完这个基本框架后,就要与大模型进行交互了,这时候,就需要我们编写提示词了, 那么以下,就会介绍提示词的几种编写方式 1 可携带变量的提示词 1.1 PromptTempla…

CyberPoC 是一个现代化的网络安全练习和竞赛平台,支持容器化部署的安全挑战,为用户提供实践网络安全技能的环境。

工具介绍 CyberPoC 是一个现代化的网络安全练习和竞赛平台&#xff0c;支持容器化部署的安全挑战&#xff0c;为用户提供实践网络安全技能的环境。 &#x1f680; 快速开始 使用 Docker Compose (推荐) 克隆项目 git clone https://github.com/dushixiang/cyberpoc.gitcd cy…

【单片机day03】

UART串口通用异步收发器&#xff0c;2个串口(1个串口被用于ISP下载程序&#xff0c;1个串口被用于和主机之间的通信)全双工&#xff08;两根线TX、RX&#xff09;、串行、异步通信方式&#xff1a;单工&#xff1a;发送方和接收方是固定的&#xff0c;数据只能从发送方 发给 …

react16到react19更新及底层实现是什么以及区别

好问题 &#x1f44d;。React 16 → 19 的更新跨度其实涵盖了 React 的几个“时代级”的演进&#xff1a;从 Fiber 架构 的重写、到 并发特性 的引入&#xff0c;再到 React Server Components 和 现代语法支持。我帮你梳理下主要更新点和底层实现的区别&#xff0c;方便你系统…

【分享】基于百度脑图,并使用Vue二次开发的用例脑图编辑器组件

偶然间发现了这个项目&#xff0c;分享出来。 【分享】基于百度脑图&#xff0c;并使用Vue二次开发的用例脑图编辑器组件1 项目地址2 项目简介3 项目部署3.1 安装node和npm3.2 项目下载3.3 修改npm镜像源3.4 部署4 项目中使用1 项目地址 基于百度脑图&#xff0c;并使用Vue二次…

Kotlin中抽象类和开放类

抽象类 (Abstract Class) 定义和特点 抽象类使用 abstract 关键字声明&#xff0c;是一种不能被直接实例化的特殊类&#xff0c;主要用于被其他类继承。 abstract class Base {open fun f() {} }abstract class Derived : Base() {override abstract fun f() // 抽象成员在类中…

TensorFlow深度学习实战(37)——深度学习的数学原理

TensorFlow深度学习实战&#xff08;37&#xff09;——深度学习的数学原理0. 前言1. 反向传播历史2. 微积分相关概念2.1 向量2.2 导数和梯度2.3 梯度下降2.4 链式法则2.5 常用求导公式2.6 矩阵运算3. 激活函数4. 反向传播4.1 前向计算4.2 反向传播5. 交叉熵及其导数6. 批量梯度…

1.1 汽车运行滚动阻力

汽车运行阻力由4部分构成&#xff1a;滚动阻力、空气阻力、坡度阻力、加速阻力。 1).汽车在水平道路上等速行驶时&#xff0c;必须克服来自地面的滚动阻力和来自空气的空气阻力。 2). 当汽车在坡道上上坡行驶时&#xff0c;还必须克服重力沿坡道的分力&#xff0c;称为坡度阻…

e203000

1&#xff09;①BIU作为核心通信枢纽&#xff0c;主要承担两大功能&#xff1a;一是连接处理器核内的关键执行单元&#xff08;包括IFU、LSU和EAI协处理器&#xff09;&#xff0c;统一管理指令和数据的内部传输路径&#xff1b;二是作为"核内计算"与"核外资源&…

Infortrend普安科技IEC私有云平台VM解决方案

Infortrend企业云&#xff08;IEC&#xff09;内置Hypervisor运行VM。功能完整、无需额外付费。在本文中&#xff0c;我们将为您详细介绍IEC是如何支持 VM的。市场现状与挑战市场现状 虚拟化市场面临转型&#xff0c;主流厂商&#xff08;如 VMware&#xff09;改用订阅制…

【代码随想录算法训练营——Day6(Day5周日休息)】哈希表——242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

LeetCode题目链接 https://leetcode.cn/problems/valid-anagram/ https://leetcode.cn/problems/intersection-of-two-arrays/ https://leetcode.cn/problems/happy-number/ https://leetcode.cn/problems/two-sum/ 题解 242.有效的字母异位词 这道题要想到用哈希表来做。同时注…

安科瑞基站智慧运维云平台:安全管控与节能降耗双效赋能

功能&#xff1a;基站智慧用电云平台通过对5G宏站和室分站点加装交/直流智能监控设备、无线采集设备以及系统管理平台&#xff0c;完成夜间无业务时段的下电操作&#xff0c;减少电能消耗&#xff0c;降低运营成本支出&#xff0c;以及提升通信设备供电线路状态的实时监测保护功…

处理省市区excel数据加工成SQL

原始数据相关内容链接 处理excel数据加工成SQL的脚本 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Excel行政区域数据转SQL脚本 - 支持特殊行政单位处理&#xff08;如省直辖县级行政单位&#xff09; - 支持批量处理 """import pand…

双碳目标下的24小时分时综合能源系统低碳优化调度:基于 Matlab/YALMIP/CPLEX的方法与仿真

在“双碳”战略目标的推动下&#xff0c;综合能源系统&#xff08;Integrated Energy System, IES&#xff09;已成为实现能源结构优化与碳排放控制的重要途径。本文以光伏、风电、燃气—电热联产&#xff08;CHP&#xff09;、燃气锅炉、电锅炉、电储能以及碳捕集&#xff08;…

TDengine 选择函数 Last() 用户手册

LAST() 函数用户手册 函数定义 LAST(expr)功能说明 LAST() 函数统计表/超级表中某列的值最后写入的非 NULL 值&#xff0c;即返回时间戳最大的非 NULL 值。 版本要求 最低版本: v3.0.0.0 返回值 数据类型: 同应用的字段返回内容: 时间戳最大的非 NULL 值及其对应的时间戳…

< 自用文 学习 > 用 Claude Code 做一个日历

环境&#xff1a; OS: Windows 11 IDE&#xff1a;TREA Model: Sonnet / Qwen (免费 Token 用完) 参考&#xff1a; Claude Code Beginner Guide – Get Started in 20 Minutes (2025) by Alex Finn 油管博客 https://www.youtube.com/watch?viYiuzAsWnHU&listTLGG1L…

Gmail 数据泄露安全警报以及启示

目前&#xff0c;大规模数据泄露和针对性钓鱼攻击持续威胁着数十亿 Gmail 用户的安全&#xff0c;受ShinyHunters、UNC6040、UNC6395等威胁组织攻击&#xff0c;25 亿 Gmail 用户面临极大风险&#xff1b;攻击者已从暴力破解转向社会工程学与混合勒索&#xff0c;而密码复用、弱…