gpt4 book ai didi

python - 类范围的异常处理程序

转载 作者:行者123 更新时间:2023-12-01 07:26:51 25 4
gpt4 key购买 nike

我想实现一种方法来全局处理来 self 的应用程序的类中的异常,而不是在调用站点处理它们,因为这会导致大量重复代码。

例如,假设我有一个这样的类(class):

class handler():
def throws_value_error(self):
raise ValueError

def throws_not_implemented_error(self):
raise NotImplementedError

# ... Imagine there are hundreds of these

在这个处理程序类中,我想要所有 ValueErrorNotImplementedError以同样的方式处理 - 一条消息说 [ERROR]: ...哪里...是来自特定实例的详细信息。

而不是复制大量:

try:
#...
except Exception as e:
# Catch the instances of the exception and handle them
# in more-or-less the same way here

我希望在类上有一个可实现的方法来一般处理这个问题:

def exception_watcher(self):
# Big if...elif...else for handling these types of exceptions

然后,当任何 Exception 时都会调用此方法。类内给出。

我的动机是使用它来实现一种通用的 Controller 接口(interface),其中 Controller 方法可以抛出异常的子类(例如 - BadRequestException ,它是 Error400Exception 的子类)。从那里,处理程序可以调度一个方法来正确配置响应,并使用适合异常类型的错误代码,并另外向消费者返回有用的回复。

显然,如果没有这个调度程序,这也是可行的 - 但这种方式肯定可以节省大量重复的代码(因此也可以节省错误)。

我在互联网上进行了很多挖掘,但没有找到任何东西。诚然,我从 Spring Boot 框架借用了这种模式。我也接受这个非Pythonic作为答案(只要你能告诉我如何正确做!)

如有任何帮助,我们将不胜感激 - 谢谢!

最佳答案

在不改变核心功能的情况下修改函数正是装饰器的用途。看一下这个示例并尝试运行它:

def catch_exception(func):
def wrapped(self, *args, **kwargs):
try:
return func(self, *args, **kwargs)
except ValueError:
self.value_error_handler()
except NotImplementedError:
self.ni_error_handler()
return wrapped

class Handler:
def value_error_handler(self):
print("found value error")

def ni_error_handler(self):
print("found not implemented error")

@catch_exception
def value_error_raiser(self):
raise ValueError

@catch_exception
def ni_error_raiser(self):
raise NotImplementedError

h = Handler()
h.value_error_raiser()
h.ni_error_raiser()

因为@catch_exception装饰器,被装饰的方法在调用时不会引发错误;相反,它们调用 wrapped 中定义的相应方法。的 try/except block ,打印一条消息。

虽然这并不完全是您所要求的,但我相信该解决方案总体上更易于管理。您都可以准确选择哪些方法应该定期引发异常以及哪些方法应该由 catch_exception 处理。 (通过决定修饰哪些方法),并通过编写额外的 except 添加其他异常类型的 future 行为内部 block wrapped并将相应的方法添加到 Handler类。

请注意,这不是一个“干净”的解决方案,因为 wrapped期望知道 selfHandler 的一个实例,看到它调用了一堆方法,即使它是 Handler 之外的函数。类...但是,嘿,这就是 Python 为您提供的鸭子打字 :-P

关于python - 类范围的异常处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57401861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com