Python 异常处理 完整学习笔记

(从基础、规范写法、常用异常、自定义异常、实操避坑 全整理,适配你的代码习惯)

一、异常核心基础概念

  1. 什么是异常

代码运行时出现的错误、逻辑非法、参数不合法等,导致程序强制终止的报错,就是异常。

  1. 主动抛出异常关键字

只有 raise是 Python 主动抛异常的关键字

  1. 两种报错本质区别
  2. 写法:raise "错误信息"

❌ 非法写法,不是业务异常,是 Python 语法报错:TypeError: exceptions must derive from BaseException

  1. 写法:Exception("错误信息")

✅ 标准规范,主动抛出业务异常,可被正常捕获、识别。

二、主动抛出异常 标准写法

1. 万能通用写法(日常开发首选)

不知道该用什么具体异常类型时,统一用顶层父类 Exception,全覆盖、不报错、好维护。

复制代码
# 万能格式

raise Exception("自定义错误提示文本")

2. 规范细分内置异常(追求严谨时使用)

内置异常是 Python 自带分类,对应不同错误场景:

  1. AttributeError:属性不存在(适配你的 Config 配置类)
  2. ValueError:数值 / 参数非法
  3. KeyError:字典键不存在
  4. TypeError:数据类型错误

示例:

复制代码
# 属性不存在专用

raise AttributeError("配置类无此属性")

# 数值错误专用

raise ValueError("年龄超出合法范围")

三、异常捕获基础 try...except

作用:拦截异常,防止程序崩溃,优雅处理错误。

复制代码
try:

    # 可能出错的代码

    Config.set_attr("test", 123)

except Exception as e:

    # 捕获异常并打印信息

    print("执行失败:", e)

四、异常的传递与复用

  1. 重新抛出原有异常

    try:

    复制代码
     1 / 0

    except:

    复制代码
     raise  # 原样抛出上层异常,不修改信息
  2. 异常链式改写(极少用,了解即可)

五、自定义异常类(重点理解)

1. 核心理解

  1. 所有异常最终都继承自 BaseException;
  2. 自定义异常,只需要继承 Python 内置 Exception
  3. 作用:区分项目业务错误、系统错误,让报错分类更清晰,方便后期排查。

2. 自定义异常 基础语法

复制代码
# 自定义业务异常基类

class BusinessError(Exception):

    """项目所有业务异常的父类"""

    pass

# 细分场景异常

class ConfigAttrError(BusinessError):

    """配置类属性不存在异常"""

    pass

class ParamError(BusinessError):

    """参数非法异常"""

    pass

3. 自定义异常 实战使用

复制代码
class Config:

    @classmethod

    def set_attr(cls, name, value):

        if not hasattr(cls, name):

            # 抛自定义异常

            raise ConfigAttrError(f"配置项【{name}】不存在")

4. 自定义异常进阶(自定义错误信息)

复制代码
class ConfigAttrError(Exception):

    def __init__(self, msg: str):

        self.msg = msg

        super().__init__(self.msg)

# 使用

raise ConfigAttrError("禁止修改私有配置属性")

5. 自定义异常的价值

  1. 区分系统异常自己项目业务异常

  2. 捕获时可以精准拦截:

    try:

    复制代码
     Config.set_attr("xxx", 1)

    except ConfigAttrError:

    复制代码
     # 只处理配置错误
    
     print("配置校验失败")

    except Exception:

    复制代码
     # 处理其他所有错误
    
     print("系统未知错误")
  3. 大型项目、SDK、库开发(如你的 LhPyQt5)必备,代码更规范。

六、结合你代码的实操标准示例

优化后 Config 配置类异常写法

复制代码
# 自定义配置专属异常

class ConfigError(Exception):

    pass

class Config:

    is_generate_manager_account = False

    @classmethod

    def set_attr(cls, name: str, value):

        if not hasattr(cls, name):

            # 规范抛异常

            raise ConfigError(f"当前配置类不存在属性:{name}")

        setattr(cls, name, value)

七、关键避坑总结

  1. ❌ 禁止:raise "文字"
  2. ✅ 强制:raise 异常类(提示文字)
  3. 日常开发:优先 raise Exception("提示") 够用
  4. 精细化开发:使用对应内置异常 / 自定义异常
  5. 异常不要滥用:正常业务逻辑不要靠异常控制,只用于「非法、错误场景」

八、极简背诵口诀

  1. 抛异常必带异常类,不能直接抛字符串;
  2. 通用报错用 Exception,细分场景用内置异常;
  3. 自定义异常继承 Exception,用于业务分类;
  4. 异常用来兜底防崩溃,不用来替代正常判断。
相关推荐
c++之路1 小时前
C++20概述
java·开发语言·c++20
芝士就是力量啊 ೄ೨2 小时前
Python如何编写一个简单的类
开发语言·python
胖虎喜欢静香2 小时前
从零到一快速实现 Mini DeepResearch
人工智能·python·开源
逻辑驱动的ken2 小时前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
MoonBit月兔2 小时前
「Why MoonBit 」第一期——Singularity Note AI 学习助手
开发语言·人工智能·moonbit
qq_392690662 小时前
Redis怎样应对Redis集群整体宕机带来的雪崩
jvm·数据库·python
木木_王2 小时前
嵌入式Linux学习 | 数据结构 (Day05) 栈与队列详解(原理 + C 语言实现 + 实战实验 + 易错点剖析)
linux·c语言·开发语言·数据结构·笔记·学习
Muyuan19982 小时前
22.让 RAG Agent 更像真实产品:聊天页面优化、PDF 上传、知识库重建与检索片段展示
python·django·pdf·fastapi
冷雨夜中漫步2 小时前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai