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