Python异常处理机制完全指南:从基础到实战

news/2025/3/19 11:59:51/文章来源:https://www.cnblogs.com/yoyoliwu/p/18780759

Python 的异常处理机制是程序运行中处理错误和异常情况的重要工具。通过异常处理,可以捕获程序运行时出现的错误,避免程序因未处理的异常而崩溃,同时还可以提供更友好的错误提示或采取相应的补救措施。以下是关于 Python 异常处理机制的详细介绍:

1. 异常的基本概念

  • 异常(Exception) :异常是指程序运行过程中出现的不正常情况,例如语法错误、运行时错误等。Python 中的异常是一个对象,表示程序运行中出现的错误或异常情况。
  • 错误(Error) :错误是程序运行中出现的不符合预期的情况,通常会导致程序中断。错误分为语法错误(Syntax Error)和运行时错误(Runtime Error)。语法错误是指代码不符合 Python 语法规范,通常在代码编写阶段就能发现;运行时错误是指程序在运行过程中出现的错误,例如除以零、访问不存在的变量等。

2. 异常处理的基本结构

Python 中使用 try...except 块来捕获和处理异常。其基本语法如下:

try:# 尝试执行的代码pass
except ExceptionType as e:# 处理异常的代码pass

示例代码

try:result = 10 / 0
except ZeroDivisionError as e:print(f"发生错误:{e}")

输出结果

发生错误:division by zero

在上述代码中,try 块中的代码是可能会引发异常的代码。如果在 try 块中发生了异常,程序会跳转到 except 块中处理异常。except 块指定了要捕获的异常类型(如 ZeroDivisionError),并通过变量 e 获取异常对象,从而可以获取异常的具体信息。

3. 捕获多种异常

可以使用多个 except 子句来捕获不同类型的异常,或者使用一个 except 子句捕获所有异常。

示例代码

try:result = 10 / 0
except ZeroDivisionError as e:print(f"发生除零错误:{e}")
except TypeError as e:print(f"发生类型错误:{e}")
except Exception as e:  # 捕获其他所有异常print(f"发生其他异常:{e}")

输出结果

发生除零错误:division by zero

在上述代码中,如果发生 ZeroDivisionError,则会执行第一个 except 块;如果发生 TypeError,则会执行第二个 except 块;如果发生其他类型的异常,则会执行第三个 except 块。

4. 捕获所有异常

如果希望捕获所有异常,可以使用 except Exception as e 或直接使用 except(不推荐,因为它会捕获包括系统退出异常在内的所有异常)。

示例代码

try:result = 10 / 0
except Exception as e:print(f"发生异常:{e}")

输出结果

发生异常:division by zero

5. else 子句

else 子句用于在没有异常发生时执行的代码。else 子句必须位于所有 except 子句之后。

示例代码

try:result = 10 / 2
except ZeroDivisionError as e:print(f"发生除零错误:{e}")
else:print(f"结果为:{result}")

输出结果

结果为:5.0

在上述代码中,如果 try 块中没有发生异常,则会执行 else 子句中的代码。

6. finally 子句

finally 子句用于在 try...except 块执行完毕后,无论是否发生异常都会执行的代码。通常用于清理资源,例如关闭文件、释放网络连接等。

示例代码

try:result = 10 / 0
except ZeroDivisionError as e:print(f"发生除零错误:{e}")
finally:print("finally 子句执行")

输出结果

发生除零错误:division by zero
finally 子句执行

在上述代码中,无论是否发生异常,finally 子句中的代码都会被执行。

7. 自定义异常

Python 允许用户自定义异常类。自定义异常类必须继承自 Exception 类或其子类。

示例代码

class MyCustomError(Exception):def __init__(self, message):super().__init__(message)try:raise MyCustomError("这是一个自定义异常")
except MyCustomError as e:print(f"捕获自定义异常:{e}")

输出结果

捕获自定义异常:这是一个自定义异常

在上述代码中,定义了一个名为 MyCustomError 的自定义异常类,并在 try 块中通过 raise 关键字抛出自定义异常。然后通过 except 子句捕获并处理该自定义异常。

8. 异常链

在 Python 3 中,可以通过 raise...from 语法来指定异常链。当一个异常是由于另一个异常引起的时,可以使用 from 关键字来指定原始异常。

示例代码

try:try:result = 10 / 0except ZeroDivisionError as e:raise ValueError("无效的输入") from e
except ValueError as e:print(f"捕获异常:{e}")

输出结果

捕获异常:无效的输入

在上述代码中,内部的 try 块中发生了 ZeroDivisionError 异常,然后通过 raise 关键字抛出了一个 ValueError 异常,并通过 from 关键字指定了原始异常 e

9. 异常处理的最佳实践

  • 明确捕获异常类型 :尽量明确捕获具体的异常类型,而不是捕获所有异常。这样可以更准确地处理不同类型的异常,避免隐藏潜在的错误。
  • 使用 else 子句 :将没有异常时需要执行的代码放在 else 子句中,这样可以使代码结构更清晰。
  • 使用 finally 子句清理资源 :在 finally 子句中清理资源,确保资源在异常发生时也能被正确释放。
  • 合理使用自定义异常 :当需要表示特定的错误情况时,可以定义自定义异常类,使代码更具可读性和可维护性。
  • 记录异常信息 :在捕获异常时,可以使用日志记录异常信息,方便后续的调试和排查问题。

总之,Python 的异常处理机制是一种强大的工具,可以帮助我们编写更健壮、更可靠的程序。通过合理使用异常处理机制,可以有效地处理程序运行中的错误和异常情况,提高程序的稳定性和用户体验。

文章来源于zlibrary图书馆中《Python编程从入门到实践》书的Python异常处理机制章节内容

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

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

相关文章

USB杂谈

一、USB控制器 OHCI 1.0、1.1控制器 UHCI:1.0、1.1控制器 EHCI 2.0控制器 XHCI 3.0控制器 EHCI 2.0控制器 HID:人机交互接口,鼠标、手柄 、键盘、扫描枪USB协议中对集线器的层数是有限制的,USB1.1规定最多为5层,USB2.0规定最多为7层。 理论上,一个USB主控制器最多可接127个…

2025年3月中国数据库排行榜:PolarDB夺魁傲群雄,GoldenDB晋位入三强

2025年3月排行榜解读出炉,榜单前四现波动,PolarDB时隔半年重返榜首、GoldenDB进入前三,此外更有一些新星产品表现亮眼!欢迎阅读、一起盘点~阳春三月,万物复苏。2025年3月中国数据库流行度排行榜的发布,不仅展现了中国数据库企业在技术创新、生态建设和应用深化方面的显著…

# 20241902 2024-2025-2 《网络攻防实践》第四周作业

1.实验内容 通过本次实验,在搭建的实验环境中完成TCP/IP协议栈重点协议的攻击实验,包括ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击,并熟悉wireshark、netwox和ettercap等软件的操作。 2.实验过程 实验1 ARP缓存欺骗攻击 本实验中Kali为…

【Azure Fabric Service】分享使用Visual Studio 2022发布中国区Service Fabric服务应用的办法

问题描述 使用Visual Studio 2022如何发布Service Fabric到中国区云服务呢? 因为使用VS2022中的插件无法创建Service Fabric Cluster服务。那么,是否又比较好的替代方案呢?问题解答 是的,有替代方案。 除了昨天介绍使用的Powershell命令外( 【Azure Fabric Service】演示使…

如何让GameObject销毁时无论是否Active过,都调用OnDestroy

1)如何让GameObject销毁时无论是否Active过,都调用OnDestroy2)升级到URP画面会提升吗3)如何用Dynamic Mesh做出在墙上打洞的效果4)UE可以把烘焙好的光照贴图导出吗这是第424篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力…

测序芯片-不同键合工艺对比-flowcell-代加工-外协加工-委外加工-激光代加工-河南郑州-芯晨微纳(河南)

基因测序(包括DNA测序和RNA测序)是研究生命信息的重要方法之一。DNA测序(DNA sequencing,或译DNA定序)是指分析特定DNA片段的碱基序列, 也就是腺嘌呤(A)、胸腺嘧啶(T)、胞嘧啶(C)与鸟嘌呤(G)的排列方式。同理,RNA测序是指分析特定RNA片段的碱基序列,也就是腺嘌呤(A)、鸟嘌呤…

Go语言内存管理机制解析

引言 Go语言以高并发性能和简洁的内存管理著称,其独特的内存分配机制在保证开发效率的同时,实现了接近C/C++的性能。本文将深入剖析Go的内存管理设计,结合内存逃逸、多级缓存池、无锁化分配等核心机制,揭示其高效运作的秘密。 参考文档 https://www.bilibili.com/video/BV1…

HTTP响应拆分漏洞——CRLF注入漏洞

CRLF漏洞 CRLF注入漏洞:web应用没有对用户输入做严格过滤,导致攻击者可以输入一些恶意字符,攻击者向请求行或首部中的字段注入恶意的CRLF,就能注入一些首部字段或报文主题,并在响应中输出。 HTTP报文中,HTTP header之间是由一个CRLF字符序列分隔开的,HTTP Header 与Body…

图案化CCD视觉精密点胶技术-flowcell-代加工-外协加工-委外加工-激光代加工-河南郑州-芯晨微纳(河南)

图案化视觉点胶技术(Patterned Vision Dispensing Technology)是一种结合高精度点胶工艺与机器视觉系统的先进制造技术,能够根据预设的图案或路径精确分配胶水、导电浆料、封装材料等流体,广泛应用于电子封装、微纳制造、生物芯片等领域。技术原理视觉定位:通过高分辨率摄…

充电桩消防火焰检测系统

充电桩消防火焰检测系统的核心在于其强大的识别能力,充电桩消防火焰检测系统一旦检测到火焰或烟雾,系统会立即启动一系列自动响应机制。首先,自动灭火系统会被触发,根据充电桩的具体环境和安全规范,选择合适的灭火方式,如气体灭火或水喷淋系统。这种即时干预能够在火势初…