每一个异常升高时调用钩子函数

比方说,我希望能够登录到文件中的每个引发任何异常时候,任何地方在我的计划。 我不想修改任何现有的代码。

当然,这可以推广到能够每引发一个例外时插入一个钩。

将下面的代码被认为是安全的做这样的事?

class MyException(Exception): def my_hook(self): print('---> my_hook() was called'); def __init__(self, *args, **kwargs): global BackupException; self.my_hook(); return BackupException.__init__(self, *args, **kwargs); def main(): global BackupException; global Exception; BackupException = Exception; Exception = MyException; raise Exception('Contrived Exception'); if __name__ == '__main__': main();

--------------解决方案-------------

如果要记录未捕获的异常 ,只是用sys.excepthook。

我不知道我看到记录所有引发的异常值,因为,许多图书馆将提高内部的东西,你可能不会在意/捕获异常。

您的代码,据我可以告诉是行不通的。

  1. __init__必须返回None和你试图返回备份异常的一个实例。 一般来说,如果你想实例化一个类,你应该重写何时改变返回什么情况下__new__
  2. 不幸的是,你不能改变任何的属性的Exception类。 如果这是一个选项,你可以有改变Exception.__new__放在你的钩子那里。
  3. 在“ global Exception ”把戏将仅在当前模块中的代码。 Exception是一个内建,如果你真的想在全球范围内,你需要改变它import __builtin__; __builtin__.Exception = MyException import __builtin__; __builtin__.Exception = MyException
  4. 即使你改变__builtin__.Exception只会影响未来使用Exception ,这已经被定义将使用原来的异常类,并不会受到更改子类。 你可以遍历Exception.__subclasses__改变__bases__他们中的每一个插入Exception的子类有。
  5. 有子类Exception ,它们也内建类型,你也不能修改,虽然我不知道你要挂钩的任何人(想想StopIterration

我认为,唯一体面的方式做你想要的是打补丁的Python源。

此代码不会影响开始前创建的任何异常类main ,而且大部分将要发生这种类型的(例外的KeyError AttributeError ,等等)。 你不能真正影响到那些“内建异常”最重要的意义-如果在你的代码的任何地方,例如是1/0,真正ZeroDivisionError将提高(由Python的内部),而不是任何其他你可能已经绑定到异常的名字。

所以,我不认为你的代码可以做你想做的(尽管所有的分号,它仍然应该是Python的,对不对?) - 这是可以做到通过修改C源码为Python运行时,基本上是(通过如提供一个钩子可能流行起来,即使它后来抓到任何异常 ) -这样的钩子目前并不存在,因为用例将是非常罕见的(例如,一个StopIteration总是提出在每个正常结束for循环-芜杂,太;一种为什么地球上会要跟踪 ,一把抓住异常在Python内部的许多其他日常用途和标准库的?!)。

下载pypy和仪器了。

分类:蟒蛇 时间:2012-10-28 人气:0
本文关键词: 蟒蛇,异常
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.394 (s). 10 q(s)