2

我有几种方法可以引发我的自定义异常。引发异常后,我需要对其进行处理,例如将消息记录到控制台并将其保存到数据库中。

我正在考虑帖子标题中描述的一个疯狂的解决方法 - 我可以将带有日志记录和数据库保存的自定义代码移动到__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__是否真的很疯狂,因为每次引发异常时都会这样做。

感谢您的意见!

4

2 回答 2

1

如果你要做这样的事情,正如其他人所说的那样,这是一个有问题的目标,我建议通过logging.Logger你的异常中的a 路由消息__init__,然后附加logging.Handlers以记录到数据库,打印到控制台,或者你曾经做过的任何事情想。然后,您的库的用户可以以更容易、更标准化的方式控制(和扩展)系统。

于 2013-07-02T13:57:15.970 回答
1

好像你在建议两件不同的事情。首先,有在异常中包含一些自定义代码的想法,这远非疯狂并且是相当可行的。

例子:

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

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

就个人而言,如果您想要在引发异常时使用大量逻辑(在不知道您的特定目标的情况下很难对此发表评论),我建议您在__init__方法中放置一个记录器,然后将您的逻辑直接放入try/except其中,这正是它们的用途.

于 2013-07-02T13:54:18.363 回答