异样解决是写好代码的一个重要的方面,尽管许多开发人员都相熟根本的 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