Python 异常处理完全指南

目录

    • 一、异常处理基础
      • 1. 基本语法结构
    • 二、常见异常类型
      • 1. 内置异常层次
      • 2. 常见异常示例
    • 三、多重异常处理
      • 1. 合并捕获
      • 2. 分层处理
    • 四、finally与else子句
      • 1. finally 应用场景
      • 2. else 使用技巧
    • 五、自定义异常
      • 1. 创建异常类
      • 2. 异常继承体系
    • 六、异常链与上下文
      • 1. raise from 语法
      • 2. 异常上下文查看
    • 七、最佳实践与陷阱
    • 综合实战案例


异常处理流程图

一、异常处理基础

1. 基本语法结构

try:# 可能引发异常的代码result = 10 / 0
except ZeroDivisionError:# 处理特定异常print("不能除以零!")
except Exception as e:# 通用异常处理print(f"发生错误: {e}")
else:# 无异常时执行print("计算成功")
finally:# 始终执行的清理代码print("清理资源")
  1. 异常传播机制
触发异常
当前代码有try块?
匹配except
向调用栈上层传播
执行对应处理
到达顶层?
程序崩溃

二、常见异常类型

1. 内置异常层次

所有异常类都继承 BaseException

BaseException├── KeyboardInterrupt├── SystemExit└── Exception├── ArithmeticError│    ├── ZeroDivisionError│    └── FloatingPointError├── LookupError│    ├── IndexError│    └── KeyError├── OSError│    ├── FileNotFoundError│    └── PermissionError└── ValueError

2. 常见异常示例

# 文件操作
try:with open("nonexist.txt") as f:content = f.read()
except FileNotFoundError:print("文件不存在")# 类型转换
try:num = int("abc")
except ValueError:print("无效的数字格式")# 字典操作
d = {"key": "value"}
try:print(d["missing"])
except KeyError:print("键不存在")

三、多重异常处理

1. 合并捕获

try:# 可能抛出多种异常的代码
except (TypeError, ValueError) as e:print(f"输入类型错误: {e}")

2. 分层处理

try:data = json.loads(invalid_json)
except json.JSONDecodeError:print("JSON解析失败")
except Exception:print("其他未知错误")

四、finally与else子句

1. finally 应用场景

file = None
try:file = open("data.txt", "r")process(file)
except IOError:print("文件操作错误")
finally:if file:file.close()  # 确保资源释放

2. else 使用技巧


try:result = risky_operation()
except NetworkError:handle_error()
else:save_result(result)  # 仅在成功时执行

五、自定义异常

1. 创建异常类

class InvalidEmailError(ValueError):"""自定义邮箱格式异常"""def __init__(self, email):super().__init__(f"无效邮箱格式: {email}")self.email = email# 使用示例
email = "user@"
if "@" not in email or "." not in email.split("@")[1]:raise InvalidEmailError(email)

2. 异常继承体系

class DatabaseError(Exception):"""数据库操作基类异常"""class ConnectionError(DatabaseError):"""数据库连接异常"""class QueryError(DatabaseError):"""SQL查询异常"""

六、异常链与上下文

1. raise from 语法

try:config = load_config()
except FileNotFoundError as e:raise RuntimeError("配置加载失败") from e

2. 异常上下文查看

try:# 可能出错的代码
except Exception as e:print("原始异常:", e.__cause__)print("上下文:", e.__context__)

七、最佳实践与陷阱

推荐做法

  1. 具体异常捕获优先
  2. 添加有意义的错误信息
raise ValueError(f"无效参数值: {value}")
  1. 日志记录异常
import logging
try:process()
except Exception:logging.exception("处理失败")

⚠️ 避免陷阱

  1. 捕获过于宽泛的异常
try:...
except:  # 捕获所有异常,包括KeyboardInterruptpass
  1. 忽略异常
try:...
except Exception:pass  # 静默失败
  1. 重复抛出异常
try:...
except Exception as e:print(e)raise  # 保留原始堆栈信息

综合实战案例

网络请求重试机制

import requests
from time import sleepdef fetch_data(url, retries=3):for attempt in range(retries):try:response = requests.get(url, timeout=5)response.raise_for_status()return response.json()except requests.HTTPError as e:print(f"HTTP错误: {e}")except requests.Timeout:print("请求超时")except requests.RequestException:print("网络连接问题")if attempt < retries - 1:sleep(2 ** attempt)  # 指数退避raise Exception(f"请求失败,已重试{retries}次")# 使用示例
data = fetch_data("https://api.example.com/data")

通过掌握这些异常处理技巧,您可以:

  • 编写更健壮的程序
  • 提高错误诊断效率
  • 创建更友好的用户交互体验
  • 构建可维护的异常处理体系

建议在实际开发中结合具体业务场景,设计合理的异常处理策略,并定期审查异常处理代码的有效性

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

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

相关文章

【Qt】Ubuntu22.04使用命令安装Qt5和Qt6

1、安装Qt5 注意:Ubuntu22.04已经没有 qt5-default ,因此不能一键安装啦 1)安装核心组件 sudo apt install qtbase5-dev qtchooser qt5-qmake qtcreator2)安装QtCreator sudo apt install qtcreator3)安装工具包、Qt Quick 开发的核心库(qtdeclarative5-dev) sudo a…

手撸一个 deepseek 数据库对话,打造一个企业智能通讯录(ollama + deepseek + langchain)

前言 由于 deepseek 等大语言模型数据时效性问题&#xff0c;无法跟上现实世界信息的动态变化&#xff0c;企业内部信息更是无法理解&#xff0c;为了将 deepseek 应用到企业内部&#xff0c;之前有写过通过联网搜索、上传文件、搭建知识等检索增强生成&#xff08;RAG&#xf…

线段树SegmentTree

线段树当中的几个重要操作 1.PushUp 上推操作&#xff1a;由子节点算父节点的信息 p u s h u p push up pushup 操作的目的是为了维护父子节点之间的逻辑关系。当我们递归建树时&#xff0c;对于每一个节点我们都需要遍历一遍&#xff0c;并且电脑中的递归实际意义是先向底层…

SSH免密登录服务器方法

Window免密连接Linux系统 生成公匙 ssh-keygen -t rsa一路回车生成公钥 复制公匙&#xff0c;使用记事本打开复制全部内容 notepad C:\Users\DELL\.ssh\id_rsa.pub内容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 远程登录服务器将内容写入~/.ssh/authorized_keys echo …

Go 1.24 新特性解析:泛型类型别名、弱指针与终结器改进

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

MySQL 表 t1 建立联合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

文章目录 联合索引 abc 均范围扫描时的索引生效情况无回表 表数据量非常少无回表 表数据量多有回表总结 联合索引 abc 均范围扫描时的索引生效情况 场景&#xff1a;表 t1 建立联合索引 (a, b, c)&#xff0c;在 where a < ? and b > ? and c < ? 中哪些索引生效…

海外营收占比近4成,泡泡玛特全球化战略迎收获期

3月26日&#xff0c;泡泡玛特国际集团发布2024全年财报。财报显示&#xff0c;2024年泡泡玛特实现营收130.4亿元&#xff08;人民币&#xff0c;下同&#xff09;&#xff0c;同比增长106.9%&#xff0c;经调整净利润34.0亿元&#xff0c;同比增长185.9%。中国内地营收79.7亿元…

ctf-web: 不统一的解析 + sql注入要求输入与输出相等 -- tpctf supersqli

# 从 django.shortcuts 模块导入 render 函数&#xff0c;用于渲染模板 from django.shortcuts import render # 从 django.db 模块导入 connection 对象&#xff0c;用于数据库连接 from django.db import connection# 此模块用于创建视图函数 # 从 django.http 模块导入 Http…

LLM推理加速框架有哪些

LLM推理加速框架有哪些 目录 LLM推理加速框架有哪些1. TensorRT简介简单使用示例2. Triton Inference Server简介简单使用示例3. SGLang简介简单使用示例4. vLLM简介简单使用示例1. TensorRT 简介 TensorRT 是 NVIDIA 推出的一个用于高性能深度学习推理的 SDK。它能够对训练好…

【深度学习与实战】2.1、线性回归模型与梯度下降法先导案例--最小二乘法(向量形式求解)

为了求解损失函数 对 的导数&#xff0c;并利用最小二乘法向量形式求解 的值&#xff0c;我们按照以下步骤进行&#xff1a; ‌1. 损失函数的含义‌ 这是‌线性回归‌的平方误差损失函数&#xff0c;目标是最小化预测值 与真实值 之间的差距。 ‌定义损失函数‌&#xf…

S7-1200对V90 PN进行位置控制的三种方法

S7-1200系列PLC通过PROFINET与V90 PN伺服驱动器搭配进行位置控制,实现的方法主要有以下三种: ? 方法一、在PLC中组态位置轴工艺对象,V90使用标准报文3,通过MC_Power、MC_MoveAbsolute等PLC Open标准程序块进行控制, 这种控制方式属于中央控制方式(位置控制在PLC中计算,驱…

爱普生FC-135晶振5G手机的极端温度性能守护者

在5G时代&#xff0c;智能手机不仅需要高速率与低延迟&#xff0c;更需在严寒、酷暑、振动等复杂环境中保持稳定运行。作为 5G 手机的核心时钟源&#xff0c;爱普生32.768kHz晶振FC-135凭借其宽温适应性、高精度稳定性与微型化设计&#xff0c;成为5G手机核心时钟源的理想选择&…

ROS--IMU数据包

IMU惯性测量单元 一&#xff1a;IMU二&#xff1a;ROS中三&#xff1a;IMU数据包三&#xff1a;总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一&#xff1a;IMU IMU&#xff08;Inertial Measurement Unit&#xff0c;惯性测量单元&#xff09…

数据文件误删除,OceanBase中如何重建受影响的节点

当不慎误删数据文件且当前没有现成的可替换节点时&#xff0c;在OceanBase中&#xff0c;不必急于采取极端措施&#xff0c;可以考虑运用 server_permanent_offline_time 参数&#xff0c;来重建受影响的节点。 原理&#xff1a; server_permanent_offline_time 是 OceanBase数…

Python:匹配多个字符,如何匹配开头

匹配字符0次或无数次(*)&#xff1a; import re resre.match([A-Z][a-z]*,Lihailu) print(res.group())#提取数据 输出结果可以全部输出 匹配字符至少一次()&#xff1a; import re resre.match([A-Za-z]python,apython) print(res.group())#提取数据(后边只写python会…

Unity-RectTransform设置UI width

不知道有没人需要这样的代码&#xff0c;就是.sizeDelta //不确定是不是英文翻译的原因&#xff0c;基本很难理解&#xff0c;sizeDeltaSize&#xff0c;//未必完全正确&#xff0c;但这么写好像总没错过 //image 在一个UnityEngine.UI.Image 的数组内foreach (var image in l…

java学习——函数式编程(1)

函数式编程 Java 的函数式编程是一种以函数为核心构建逻辑的编程范式,强调不可变性、声明式代码和无副作用的操作。它通过Lambda表达式、函数式接口(如Function、Predicate、Consumer等)和Stream API等特性实现,将计算过程抽象为函数的组合与转换,而非传统的命令式步骤。…

AP CSA FRQ Q2 Past Paper 五年真题汇总 2023-2019

Author(wechat): bigshuang2020 ap csa tutor, providing 1-on-1 tutoring. 国际教育计算机老师, 擅长答疑讲解&#xff0c;带学生实践学习。 热爱创作&#xff0c;作品&#xff1a;ap csa原创双语教案&#xff0c;真题梳理汇总&#xff0c; AP CSA FRQ专题冲刺, AP CSA MCQ小题…

线程池详解:在SpringBoot中的最佳实践

线程池详解&#xff1a;在SpringBoot中的最佳实践 引言 在Java并发编程中&#xff0c;线程池是一种非常重要的资源管理工具&#xff0c;它允许我们在应用程序中有效地管理和重用线程&#xff0c;从而提高性能并降低资源消耗。特别是在SpringBoot等企业级应用中&#xff0c;正…

2025年IT行业技术革命全景解析:从AI到量子计算的落地实践

简介 2025年&#xff0c;全球IT行业正经历一场由AI、量子计算、物联网等技术驱动的变革。从BOE的AI制造系统到德易科技的无人机光伏巡检&#xff0c;从鲲鹏处理器的国产化突破到量子计算的算力革命&#xff0c;技术创新正在重塑产业格局。本文结合最新行业动态与实战案例&…