Python:尝试/除了整个模块

时间:2013-06-01 19:05:21

标签: python exception try-catch

我有一个包含函数和几个类的python模块。这个模块基本上被我的几个同事用作工具集。

我想建立一种错误报告系统,只要有人生成我不处理的异常,就会发送一封包含异常信息的电子邮件。通过这种方式,我可以不断提高代码的健壮性和我自己的错误消息的完整性。最好的方法是在整个模块周围放置一个try / except块吗?

2 个答案:

答案 0 :(得分:3)

我认为您的方法可能不是最好的,有几个原因。

有时会抛出异常 。例如,如果我将一些愚蠢的参数传递给函数,它应该通过抛出异常来抱怨。每次有人传递字符串而不是整数时,您都不希望收到电子邮件,等等吗?

此外,将整个事物包装在一个try ...中除了不起作用,因为这只会捕获在定义类/函数期间(加载/导入模块时)会发生的异常。例如,

# Your python library
try:
   def foo():
       raise Exception('foo exception')
       return 42
except Exception as e:
   print 'Handled: ', e

# A consumer of your library
foo()

例外情况仍未解决。

答案 1 :(得分:2)

我猜你可以创建自己的SelfMailingException并将其子类化。不是我会推荐这种方法。

另一种选择:

def raises(*exception_list):
    def wrap(f):
        def wrapped_f(*x, **y):
            try:
                f(*x, **y)
            except Exception as e:
                if not isinstance(e, tuple(exception_list)):
                    print('send mail')
                    # send mail
                raise
        return wrapped_f
    return wrap

用法:

@raises(MyException)
def foo(): 
    ...