20个改善编码的Python异常处理技巧,让你的代码更高效

news2024/11/17 21:21:05

异常处理是写好代码的一个重要的方面,虽然许多开发人员都熟悉基本的try-except块,但是有很多更深入的知识可以使异常处理更高效、更可读和更python化。所以本文将介绍关于Python异常的20个可以显著改善编码的Python异常处理技巧,这些技巧可以让你熟练的掌握Python的异常处理。

Python中的异常是在程序执行期间发生的破坏了程序指令的正常流程的事件。与其他编程语言一样,Python使用异常来代表错误发生的信号,程序可以做出反应,并恢复或通知用户产生的问题。

1、最简单的异常处理

我们都知道最简单的异常处理如下:

 try:
     # Your code here
 except IOError:
     # Handle I/O errors
 except Exception as e:
     # Handle other exceptions
 finally:
     # Cleanup, runs no matter what

异常是按层次结构组织的,如果发生了IOError会执行IOError的except代码,剩下的异常则交由Exception处理。理解这个层次结构可以根据需要更广泛或更具体地捕获错误。

使用finally子句确保执行清理操作,而不管是否发生异常。它非常适合关闭文件或释放资源。

2、自定义异常

创建自定义异常可以使代码更具可读性和可维护性,可以清楚地表示特定的错误条件。

 class MyCustomError(Exception):
     pass
 
 try:
     raise MyCustomError("A specific error occurred")
 except MyCustomError as e:
     print(e)

3、Else in Try-Except

如果没有引发异常,则try-except块中的else子句将运行。这是其他语言没有的

 try:
     # Attempt operation
 except Exception:
     # Handle error
 else:
     # Executes if no exceptions

4、AS关键字

在捕获异常时,可以使用as关键字将异常分配给一个变量,这样可以显示详细信息并使调试更容易。

 try:
     # Some operation
 except Exception as e:
     print(f"Error: {e}")

5、捕获多个异常

元组可用于在一行中捕获多种异常类型,从而简化错误处理代码。

 try:
     # Risky operation
 except (TypeError, ValueError) as e:
     # Handle both exceptions

6、异常触发另外的异常

Python允许在使用from保持原始回溯的同时触发新的异常,从而帮助调试复杂的场景。

 try:
     # Some operation
 except Exception as original_error:
     raise RuntimeError("Something bad happened") from original_error

这种方法有好有坏,所以如果不熟悉的话建议还是不要用。

7、忽略异常

使用contextlib.suppress()函数,可以优雅地忽略特定的异常,从而使代码更清晰、更易读。

 from contextlib import suppress
 
 with suppress(FileNotFoundError):
     # Operation that might not find a file

8、使用断言

如果不满足条件,可以使用断言抛出异常。但是要谨慎使用它们,因为它们可以通过执行时的优化标志被禁用。

 assert condition, "Condition was not met"

assert 断言会抛出AssertionError,可以在except中直接捕获

9、格式化异常信息

利用Traceback模块打印详细的异常信息,这样可以显示完整的错误来帮助调试。

 import traceback
 
 try:
     raise ValueError("An error occurred")
 except:
     traceback.print_exc()  # Print exception information to stderr

10、使用warnings模块发出非致命警报

warnings模块发出是警告而不是异常。如果希望在不停止程序执行的情况下提醒用户或开发人员潜在问题时,它非常有用。

 import warnings
 
 warnings.warn("This is a warning message", UserWarning)

11、忽略异常

suppress函数被用来忽略特定的异常。contextlib可以确保资源在使用后得到适当的清理。

 from contextlManaging Resources: Illustrates creating context managers for resource management, ensuring resources are properly cleaned up after use. The suppress function is shown to ignore specific exceptions.ib import contextmanager, suppress
 
 @contextmanager
 def managed_resource():
     try:
         resource = "Resource"
         yield resource
     finally:
         print("Resource cleanup")
 
 with managed_resource() as res:
     print(res)
 
 with suppress(FileNotFoundError):
     open('non_existent_file.txt', 'r')  # Suppresses the FileNotFoundError

12、创建处理异常的包装器函数

functools模块可以创建一个装饰器来包装用于集中异常处理的函数,从而简化跨多个函数的错误管理。

 from functools import wraps
 
 def exception_handler(func):
     @wraps(func)
     def wrapper(*args, **kwargs):
         try:
             return func(*args, **kwargs)
         except Exception as e:
             print(f"Handled exception: {e}")
             return None
     return wrapper
 
 @exception_handler
 def risky_function():
     raise ValueError("Something went wrong")
 
 risky_function()

13、访问异常相关的属性和函数

使用sys.exc_info()可以获取有关当前异常的详细信息,这对于进一步记录或处理错误细节很有用。

 import sys
 
 try:
     raise TypeError("An error occurred")
 except:
     exc_type, exc_value, exc_traceback = sys.exc_info()
     print(exc_type, exc_value)

14、分析当前异常上下文

利用inspect模块分析当前异常上下文,这对于复杂的错误处理场景特别有用。

 import inspect
 
 def current_exception():
     for frame in inspect.trace():
         if frame[3] == 'risky_function':
             return frame[0].f_locals.get('e')
 
 try:
     risky_function()
 except Exception as e:
     print(current_exception())

15、创建动态异常类

types模块可以动态创建异常类。这对于基于运行时条件动态生成自定义异常非常有用。

 import types
 
 DynamicException = types.new_class('DynamicException', (Exception,))
 raise DynamicException("A dynamically created exception")

16、访问所有内置异常

builtins可以列出Python中可用的所有内置异常,帮助我们了解层次结构和各种异常。

 import builtins
 
 for name in dir(builtins):
     obj = getattr(builtins, name)
     if isinstance(obj, type) and issubclass(obj, BaseException):
         print(name)

17、自定义异常的字符串表示形式

可以通过覆盖__str__和__repr__方法来演示自定义异常,获得更多信息丰富的错误消息。

 class MyException(Exception):
     def __str__(self):
         return "This is a custom message for MyException"
 
     def __repr__(self):
         return "MyException()"
 
 raise MyException

18、创建不被except Exception捕获的异常

常规except的Exception块会捕获从BaseException派生的异常,比如非常严重的错误我们可以派生字BaseException。

 class MyCriticalError(BaseException):
     pass
 
 try:
     raise MyCriticalError("A critical error")
 except Exception as e:
     print("This will not catch MyCriticalError")

19、优雅的处理用户和系统中断

捕获KeyboardInterrupt和SystemExit异常,以优雅地处理用户或系统启动的关机。

 import sys
 
 try:
     while True:
         continue
 except KeyboardInterrupt:
     print("User interrupted the process")
     sys.exit(0)

20、生成器的资源回收

GeneratorExit表示生成器执行时产生了异常,捕获它可以在关闭生成器时进行清理操作。

 def my_generator():
     try:
         yield "Hello"
     except GeneratorExit:
         print("Generator closing")
         raise
 
 gen = my_generator()
 next(gen)
 gen.close()

总结

Python异常可以极大地增强代码的健壮性和清晰度。本文整理的20个异常处理代码示例可以帮助你充分利用Python的错误处理能力,显著改善代码的异常处理能力。

https://avoid.overfit.cn/post/a4865267399848feb0f35ae0f15d61c2

作者:Ravi M

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

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

相关文章

C/C++内存管理学习【new】

文章目录 一、C/C内存分布二、C语言中动态内存管理方式:malloc/calloc/realloc/free三、C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型四、operator new与operator delete函数五、new和delete的实现原理5.1 内置类型 六、定位new表达式(pl…

天锐绿盾 | 文件数据\资料防泄漏软件 \ 自动智能透明加密保护

怎么防止公司办公终端文件数据资料外泄? 防止公司办公终端文件数据资料外泄是非常重要的,以下是一些有效的措施: 限制访问权限:根据员工的职责和需求,设定文件和数据资料的访问权限。确保只有授权人员才能访问敏感信息。 加密存…

2024图像处理分析与信息工程国际学术会议(IACIPIE2024)

2024图像处理分析与信息工程国际学术会议(IACIPIE2024) 会议简介 2024图像处理分析与信息工程国际学术会议(IACIPIE2024)将在中国长沙举行。 IACIPIE2024是一个年度会议,探讨图像处理分析和信息工程相关领域的发展和影响,旨在介…

数字孪生低代码平台盘点(一):厂家介绍

特别说明:本文根据网上资料搜集整理而成,排名不分先后,配图是为了更好地阅读体验,并非表明该图为该平台所生产。如有错误之处,请在评论区提出。 一、优锘ChartBuilder 优锘ChartBuilder是一款基于Web的数据可视化工具…

C++的vector容器->基本概念、构造函数、赋值操作、容量和大小、插入和删除、数据存取、互换容器、预留空间

#include<iostream> using namespace std; #include <vector> //vector容器构造 void printVector(vector<int>& v) { for (vector<int>::iterator it v.begin(); it ! v.end(); it) { cout << *it << " "…

挑战杯 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

RGB颜色如何转换为十六进制?16进制颜色代码怎么转为RGB颜色值?

我们在调整网站的色彩搭配&#xff0c;或修改图片的时候&#xff0c;偶尔需要用到RGB颜色值&#xff0c;或者16进制颜色代码。 如果我只知道16进制颜色代码想要知道RGB颜色值&#xff0c;那么16进制颜色代码怎么转为RGB颜色值&#xff1f;又或者我知道RGB颜色值想要知道16进制…

ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器

ubuntu系统上的软件相比CentOS更新还是比较快的&#xff0c;但是还是难免有一些软件更新得不那么快&#xff0c;比如LLVM Clang编译器&#xff0c;目前ubuntu 22.04版本最高还只能安装LLVM 15&#xff0c;而LLVM 18 rc版本都出来了。参见https://github.com/llvm/llvm-project/…

Jenkins使用遇到的一些问题

一&#xff1a;插件依赖报错 比如遇到一堆插件报错&#xff0c;不是提示版本对不上&#xff0c;就是启用不了 这样直接把Jenkins升级就行了&#xff0c;比如我这个是命令行启动的&#xff0c;直接把他替换就好了 如果是遇到插件依赖报错&#xff0c;比如A插件异常 则点击这个插…

训练Sora模型,你可能需要这些开源代码,模型,数据集及算力评估

在之前的文章&#xff0c;我们总结了Sora模型上用到的一些核心技术和论文 复刻大模型 Sora 有多难&#xff1f;一张图带你读懂 Sora 的技术路径一文看懂大模型 Sora 技术推演 今天这篇文章来自我们社区讨论交流&#xff0c;我这边整理和总结现有的一些开源代码、模型、数据集…

网页数据的存储--存储为文本文件(TXT、JSON、CSV)

用解析器解析出数据后&#xff0c;接下来就是存储数据了。数据的存储有多种多样&#xff0c;其中最简单的一种是将数据直接保存为文本文件&#xff0c;如TXT、JSON、CSV等。这里就介绍将数据直接保存为文本文件。 目录 一、Python存储数据的方法 1、 文件读取 2、 文件写入…

milvus Delete api写s3的流程

Delete api写s3的流程 milvus版本:v2.3.2 整体架构: Delete 的数据流向 delete相关配置 dataNode:segment:insertBufSize: 16777216 # Max buffer size to flush for a single segment.deleteBufBytes: 67108864 # Max buffer size to flush del for a single channelsyncPe…

Neo4j导入数据之JAVA JDBC

目录结构 前言设置neo4j外部访问代码整理maven 依赖java 代码 参考链接 前言 公司需要获取neo4j数据库内容进行数据筛查&#xff0c;neo4j数据库咱也是头一次基础&#xff0c;辛辛苦苦安装好整理了安装neo4j的步骤&#xff0c;如今又遇到数据不知道怎么创建&#xff0c;关关难…

【wails】(4):使用wails做桌面应用开发,整合chatgpt-web项目做前端,进行本地开发,web端也可以连调,使用websocket实现

1&#xff0c;视频地址 【wails】&#xff08;4&#xff09;&#xff1a;使用wails做桌面应用开发&#xff0c;整合chatgpt-web项目做前端&#xff0c;进行本地开发&#xff0c;web端也可以连调&#xff0c;使用websocket实现 2&#xff0c;演示效果 启动先是报500 错误&#…

想设计智能手环,我需要设计哪种电路?

随着电子技术的高速发展&#xff0c;可穿戴设备逐渐火爆&#xff0c;其中之一是智能手环&#xff0c;作为现代可穿戴技术的热门产品之一&#xff0c;它集成了多种功能&#xff0c;如健康检测、运动跟踪、通知提醒等&#xff0c;为了实现这些功能&#xff0c;需要用上哪些电路模…

蜂窝物联网咖WiFi认证解决方案

项目背景 随着目前网咖模式越来越流行&#xff0c;给网吧部署一套无缝漫游的WIFI网络势在必行。同时&#xff0c;网吧无线准入的验证码在客户机上面进行更新&#xff0c;以防周边的人员进行蹭网&#xff0c;损失网吧的外网带宽。 01 需求分析 1. 网吧服务区域全部覆盖无盲区…

免费的WP模板网站推荐

免费wordpress模板下载 高端大气上档次的免费wordpress主题&#xff0c;首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html wordpress免费企业主题 深蓝色经典实用的wordpress网站模板&#xff0c;用wordpress免费企业主题搭建网站。 http…

大模型+影像:智能手机“上春山”

这个春节假期&#xff0c;一首《上春山》火了。吃瓜群众热热闹闹学了一个假期的“春山学”&#xff0c;了解了抢占C位的各种技巧。 假期过去&#xff0c;开工大吉&#xff0c;手机行业开始抢占今年的C位。那么问题来了&#xff0c;今年智能手机最大的机会点在哪里&#xff1f;答…

华为---RSTP(一)---RSTP简介

目录 1. STP&#xff08;Spanning Tree Protocol&#xff0c;生成树协议&#xff09;的作用 2. STP的缺点 2.1 STP网络拓扑收敛慢 2.2 STP网络链路故障&#xff0c;端口状态切换慢 2.3 终端链路参与STP网络运算&#xff0c;浪费网络资源 2.4 STP网络拓扑变更机制复杂&…

C语言之mkdtemp()特定占位符:XXXXXX 用法实例(八十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…