在引发的异常中执行自定义代码

时间:2013-07-02 13:43:52

标签: python

我有几种方法可以引发我的自定义异常。引发异常后,我需要处理它,让我们说日志消息到控制台并将其保存到数据库中。

我正在考虑在帖子标题中描述的疯狂解决方法 - 我可以将自定义代码与日志记录和数据库保存移动到我的自定义异常的__init__方法中,因此每次引发异常时,我都会沉默因为所有需要的东西都将在异常初始化时完成。

我知道异常__init__本身可以引发另一个异常,但也可以处理:)

有人试过吗?

为什么这是疯狂的想法? :)

-

编辑:

我知道这有点疯狂,我只是好奇你的意见。我将尝试附上我想要实现的目标:

我正在使用远程数据,当通过网络与其他服务器通信时,可能会出现一些问题,每个问题都出现在其他地方: 1.网络错误 - 创建连接。 2. HTTP错误(404,500等) - 连接后; 3.远程服务器也可以返回其他一些错误

由于这些问题发生在几个不同的地方,我创建了自定义异常:

class CustomException(Exception):
    pass

然后把它提到任何地方,当我能抓住它们时,例如:

try:
    conn.open(url)
except HTTPException as e:
    raise CustomException('http')

这只是一个伪示例。

这个CustomException被捕获得更高,几乎在每个地方我都以同样的方式处理,即:

try:
     place.populate()
except CustomException as e:
     handle_exception(e)
     return False

并且handle_exception将有关问题的信息保存到数据库,还有其他事情还可以保存place的对象状态和访问日期,但始终更新相同的内容。

所以我只是想知道将handle_exception代码放在__init__中是否真的很疯狂,因为只要每次引发异常就会完成。

感谢您的意见!

2 个答案:

答案 0 :(得分:1)

好像你在暗示两件事。首先,有一个想法是在异常中使用一些自定义代码,这远非疯狂且非常可行。

示例:

class CustomException(Exception):
    def __init__(self, message, Errors):
        # do stuff here

但是,您提到每次引发异常时都会自动捕获异常。没有完成的原因非常简单,如果它不是错误,那么不要使它成为异常。如果你不计划在任何时候用它做任何事情,我很难想象有任何理由让一个类成为异常。

就个人而言,如果你想要提出异常的实质逻辑(在不知道你的特定目标的情况下有点难以对此进行评论)我会建议在__init__方法中放入一个记录器,然后将你的逻辑直接放在{ {1}}这毕竟是他们的目的。

答案 1 :(得分:1)

如果您要执行此类操作(正如其他人所说的那样)是一个值得怀疑的目标,我建议您在例外__init__中通过logging.Logger路由消息​​,然后附加{{3用于记录到数据库,打印到控制台或任何您想要的。然后,您的库的用户可以更容易,更标准化的方式控制(和扩展)系统。