0

0

如何处理Python中的异常?自定义异常如何实现?

幻影之瞳

幻影之瞳

发布时间:2025-09-03 20:24:01

|

410人浏览过

|

来源于php中文网

原创

Python通过try-except-finally实现异常处理,可捕获特定错误并执行相应逻辑,else在无异常时运行,finally始终执行用于资源清理;通过继承Exception类可创建自定义异常,提升业务错误的清晰度与处理精度。

如何处理python中的异常?自定义异常如何实现?

Python处理异常的核心机制是

try-except
语句块,它允许程序在遇到错误时优雅地捕获并响应,而不是直接崩溃。而自定义异常则提供了一种方式,让我们能根据应用自身的业务逻辑,创建更具描述性和特定性的错误类型,从而提升代码的可读性和错误处理的精细度。

说实话,写代码哪有不犯错的?运行时错误(或者说异常)是家常便饭。Python的异常处理机制,我觉得吧,就是为了让我们的程序在面对这些“意料之外”时,能有点“情商”,不至于直接甩脸子(崩溃)。

最基础的当然是

try-except
。你把可能出错的代码放进
try
块里,然后用
except
来指定当什么错误发生时该怎么做。

try:
    result = 10 / 0 # 这肯定会出ZeroDivisionError
except ZeroDivisionError:
    print("噢,除零了!数学老师会生气的。")
except TypeError: # 也可以捕获其他类型的错误
    print("类型错了,检查一下你的变量。")
except Exception as e: # 捕获所有其他异常,并把异常对象存到变量e里
    print(f"发生了未知错误:{e}")
else:
    print("一切顺利,没有异常发生!") # 如果try块里没抛异常,就执行这里
finally:
    print("不管发生啥,我都会执行,比如清理资源。") # 无论如何都会执行

这里面有几个点挺有意思的:

立即学习Python免费学习笔记(深入)”;

  • 你可以指定捕获特定的异常类型,比如
    ZeroDivisionError
    。这样能让你针对不同错误做不同的处理,挺灵活的。
  • 如果想一次捕获好几种,可以把它们放进一个元组里,像
    except (ValueError, TypeError):
  • except Exception as e
    这句,很多人会用它来捕获所有错误。但说真的,这有点像“万金油”,虽然能兜底,但有时会把一些你根本没想到的系统级错误也给吞了,导致问题更难排查。我个人建议,除非你真的知道自己在做什么,否则尽量具体一点。
  • else
    块在
    try
    块没有抛出任何异常时执行,这在某些场景下挺方便的,比如你确保某个操作成功后才进行下一步。
  • finally
    块,这个是我的老朋友了。不管
    try
    块里是成功了、抛异常了、还是被
    return
    了,
    finally
    里的代码总会执行。这对于清理资源,比如关闭文件、释放锁,简直是神来之笔。

有时候,你捕获了一个异常,处理完之后,可能还想让它继续向上层抛出,让调用者也知道发生了什么。这时候可以用

raise

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

下载
def process_data(data):
    try:
        if not isinstance(data, list):
            raise TypeError("数据必须是列表类型!")
        # 模拟一些处理
        return sum(data) / len(data)
    except TypeError as e:
        print(f"处理数据时发生类型错误:{e}")
        raise # 重新抛出异常,让调用者也能捕获到

try:
    process_data("hello")
except TypeError as e:
    print(f"外部捕获到异常:{e}")

这种

raise
就显得很负责任,既做了局部处理,又没把问题完全掩盖。

Python中为什么要自定义异常?如何创建你自己的异常类型?

我们内置的异常类型已经不少了,像

ValueError
TypeError
什么的,用起来也挺顺手。但有时候,你的程序里会遇到一些特别的“状况”,这些状况可能不是Python语法层面的错误,而是你自己的业务逻辑出了问题。这时候,内置异常就显得有点“词不达意”了。

举个例子,你开发一个电商系统,用户尝试购买一个库存不足的商品。这在Python看来,可能不是一个

IndexError
,也不是
KeyError
,它就是一个“库存不足”的业务问题。如果这时候你还用
ValueError
来表示,那下游的开发者看到这个异常,还得去猜测这个
ValueError
到底代表什么。这不就增加了沟通成本和理解难度吗?

所以,自定义异常的价值就体现出来了:

  • 清晰度:一眼就能看出问题所在,比如
    InsufficientStockError
    ValueError("库存不足")
    更直观。
  • 精细化处理:你可以针对特定的业务异常做特定的处理,而不是一锅端。
  • 代码可读性:错误类型本身就是文档,让代码更易于理解和维护。
  • 区分度:将你的应用逻辑错误与Python解释器本身的错误区分开来。

创建自定义异常其实非常简单,就是定义一个继承自

Exception
(或者更具体的内置异常,比如
ValueError
)的类。

					

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

9

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

8

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

3

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

17

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.7万人学习

MySQL 教程
MySQL 教程

共48课时 | 2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号