百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

20个示例让你熟练掌握Python异常处理

off999 2024-11-19 08:33 22 浏览 0 评论

异常处理是写好代码的一个重要的方面,虽然许多开发人员都熟悉基本的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、使用contextlib模块创建上下文管理器并会略异常

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的错误处理能力,显著改善代码的异常处理能力。

作者:Ravi M

相关推荐

面试官:来,讲一下枚举类型在开发时中实际应用场景!

一.基本介绍枚举是JDK1.5新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错...

一日一技:11个基本Python技巧和窍门

1.两个数字的交换.x,y=10,20print(x,y)x,y=y,xprint(x,y)输出:102020102.Python字符串取反a="Ge...

Python Enum 技巧,让代码更简洁、更安全、更易维护

如果你是一名Python开发人员,你很可能使用过enum.Enum来创建可读性和可维护性代码。今天发现一个强大的技巧,可以让Enum的境界更进一层,这个技巧不仅能提高可读性,还能以最小的代价增...

Python元组编程指导教程(python元组的概念)

1.元组基础概念1.1什么是元组元组(Tuple)是Python中一种不可变的序列类型,用于存储多个有序的元素。元组与列表(list)类似,但元组一旦创建就不能修改(不可变),这使得元组在某些场景...

你可能不知道的实用 Python 功能(python有哪些用)

1.超越文件处理的内容管理器大多数开发人员都熟悉使用with语句进行文件操作:withopen('file.txt','r')asfile:co...

Python 2至3.13新特性总结(python 3.10新特性)

以下是Python2到Python3.13的主要新特性总结,按版本分类整理:Python2到Python3的重大变化Python3是一个不向后兼容的版本,主要改进包括:pri...

Python中for循环访问索引值的方法

技术背景在Python编程中,我们经常需要在循环中访问元素的索引值。例如,在处理列表、元组等可迭代对象时,除了要获取元素本身,还需要知道元素的位置。Python提供了多种方式来实现这一需求,下面将详细...

Python enumerate核心应用解析:索引遍历的高效实践方案

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。根据GitHub代码分析统计,使用enumerate替代range(len())写法可减少38%的索引错误概率。本文通过12个生产...

Python入门到脱坑经典案例—列表去重

列表去重是Python编程中常见的操作,下面我将介绍多种实现列表去重的方法,从基础到进阶,帮助初学者全面掌握这一技能。方法一:使用集合(set)去重(最简单)pythondefremove_dupl...

Python枚举类工程实践:常量管理的标准化解决方案

本文通过7个生产案例,系统解析枚举类在工程实践中的应用,覆盖状态管理、配置选项、错误代码等场景,适用于Web服务开发、自动化测试及系统集成领域。一、基础概念与语法演进1.1传统常量与枚举类对比#传...

让Python枚举更强大!教你玩转Enum扩展

为什么你需要关注Enum?在日常开发中,你是否经常遇到这样的代码?ifstatus==1:print("开始处理")elifstatus==2:pri...

Python枚举(Enum)技巧,你值得了解

枚举(Enum)提供了更清晰、结构化的方式来定义常量。通过为枚举添加行为、自动分配值和存储额外数据,可以提升代码的可读性、可维护性,并与数据库结合使用时,使用字符串代替数字能简化调试和查询。Pytho...

78行Python代码帮你复现微信撤回消息!

来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。[导读]Python曾经对我说:"时日不多,赶紧用Python"。于是看...

登录人人都是产品经理即可获得以下权益

文章介绍如何利用Cursor自动开发Playwright网页自动化脚本,实现从选题、写文、生图的全流程自动化,并将其打包成API供工作流调用,提高工作效率。虽然我前面文章介绍了很多AI工作流,但它们...

Python常用小知识-第二弹(python常用方法总结)

一、Python中使用JsonPath提取字典中的值JsonPath是解析Json字符串用的,如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的,使用jsonpat...

取消回复欢迎 发表评论: