[特殊字符] Python异常处理

一、什么是异常?

在 Python 编程中,程序错误主要分为三类:

类型 说明
语法错误 代码不符合 Python 语法规范,无法运行
逻辑错误 程序能运行,但结果不符合预期
运行时错误(异常) 程序在运行过程中发生的错误

其中,我们今天重点讨论的就是------异常(Exception)

1. 异常的本质

  • 异常是程序运行过程中发生的事件

  • 会影响程序的正常执行

  • 如果不处理,会导致程序崩溃

常见异常示例:

python 复制代码
1 / 0
# ZeroDivisionError: division by zero

'2' + 2
# TypeError: can only concatenate str (not "int") to str

open('file.txt')
# FileNotFoundError

二、异常的类型

Python 中所有异常都继承自:

复制代码
php 复制代码
BaseException
  └── Exception

常见异常类型:

异常类型 触发场景
NameError 使用未定义变量
TypeError 数据类型不匹配
ValueError 传入无效参数
IndexError 列表索引越界
FileNotFoundError 文件不存在
ZeroDivisionError 除以 0

三、异常处理核心:try-except

1. 基本语法

python 复制代码
try:
    可能出错的代码
except 异常类型:
    出错后的处理代码

示例:

python 复制代码
try:
    x = 10 / 0
except ZeroDivisionError:
    print("除数不能为0!")

2. 捕获多个异常

python 复制代码
try:
    print(count)
    arr = [1,2,3]
    print(arr[5])
except NameError as e:
    print("变量未定义:", e)
except IndexError as e:
    print("索引越界:", e)

3. 捕获所有异常

python 复制代码
try:
    ...
except Exception as e:
    print("发生异常:", e)

⚠️ 不推荐滥用:

捕获所有异常会掩盖真实问题,只建议在全局保护时使用


四、异常处理进阶结构

1. try-except-else

python 复制代码
try:
    x = 10 / 2
except ZeroDivisionError:
    print("错误")
else:
    print("没有异常时执行")
  • try 没异常 → 执行 else

  • try 有异常 → 不执行 else


2. try-except-finally

复制代码
python 复制代码
try:
    f = open("test.txt")
except:
    print("出错")
finally:
    print("无论如何都会执行")
  • 关闭文件

  • 释放资源

  • 断开连接


3. 完整结构

python 复制代码
try:
    ...
except:
    ...
else:
    ...
finally:
    ...

五、主动抛出异常

1. raise 语句

python 复制代码
age = 15
if age < 18:
    raise ValueError("年龄必须大于18岁")

2. assert 断言

复制代码
python 复制代码
assert age >= 18, "年龄必须>=18"
  • 多用于测试阶段

  • 条件为 False 时抛出 AssertionError


六、异常的传递机制

异常具有"向上传递"的特性:

python 复制代码
def func1():
    return 10 / 0

def func2():
    func1()

try:
    func2()
except ZeroDivisionError:
    print("已捕获异常")
  • 下层未处理 → 向上层传递

  • 直到被捕获或程序崩溃


七、自定义异常

当内置异常无法满足需求时,可以自己定义:

python 复制代码
class AgeError(Exception):
    pass

age = 16
if age < 18:
    raise AgeError("未满18岁!")

自定义异常的好处:

  • 更符合业务语义

  • 便于维护和调试


八、with 语句与异常

1. 为什么需要 with?

传统写法:

python 复制代码
file = open("a.txt")
...
file.close()

如果中途报错,文件可能无法关闭。


2. 使用 with

python 复制代码
with open("a.txt") as f:
    print(f.read())

优势:

  • 自动释放资源

  • 更安全优雅


3. 原理:上下文管理器

支持 with 的对象都实现了:

  • __enter__()

  • __exit__()

我们也可以自定义:

复制代码
python 复制代码
class MyOpen:
    def __enter__(self):
        print("进入")
    def __exit__(self, type, val, tb):
        print("退出")

九、异常处理最佳实践

✅ 建议:

  • 精准捕获异常类型

  • 不要滥用 except Exception

  • 关键资源用 finallywith

  • 合理使用自定义异常

❌ 不建议:

  • 空 except

  • 吞掉异常不处理

  • 用异常代替逻辑判断

相关推荐
我不是疯子是傻子3 分钟前
用DeepSeek生成Qt多协议解析器?「正则+状态机+AI分支裁剪」混合调优实战
开发语言·qt
新鲜势力呀4 分钟前
深入理解 Elliot CUDA 编程核心:PHP 实现 CUDA 并行计算思想与实践
android·开发语言·php
SamChan905 分钟前
用Playwright端到端测试PDF翻译功能:Web自动化测试实战
前端·python·ai·pdf·wpf
袁袁袁袁满16 分钟前
Python爬虫实战:利用巨量IP获取跨境电商数据
爬虫·python·网络爬虫·爬虫实战·跨境电商·电商爬虫
jufeng130728 分钟前
【系列:TDengine 工业物联网实战:从零搭起可运行系统 · 第 4 篇】
python·时序数据库·tdengine·asyncio
努力搬砖的咸鱼32 分钟前
意图理解:让Agent从需求描述自动生成Pytest测试策略
人工智能·python·ai·单元测试·pytest·agent
ZJU_统一阿萨姆35 分钟前
【推理优化进阶】性能实验科学:工作负载、统计显著性与尾延迟归因
开发语言·人工智能·语言模型·系统架构·vllm
2601_956319881 小时前
2026年下半年,量化学习要把交易认知和技术实现接起来
人工智能·python
Hhy_11071 小时前
《C++深度解构02》类和对象(上)——定义规范、内存对齐与 this 指针全解
c语言·开发语言·c++·学习·visual studio
EW Frontier1 小时前
【雷达信号处理】5 个阵元追平 16 个阵元:稀疏阵列 STAP 的实测报告【附python+matlab代码】
python·matlab·信号处理·雷达·mimo·稀疏阵列·stap