我有一个包含函数和一些类的 python 模块。这个模块基本上被我的几个同事用作工具集。
我想建立一种错误报告系统,只要有人生成我不处理的异常,就会发送一封电子邮件,其中包含有关异常的信息。通过这种方式,我可以不断提高我的代码的健壮性和我自己的错误消息的帮助性。最好的方法是在整个模块周围放置一个 try/except 块吗?
有几个原因我认为你的方法可能不是最好的。
有时应该抛出异常。例如,如果我将一些愚蠢的参数传递给函数,它应该通过抛出异常来抱怨。您不想每次有人传递字符串而不是整数时都收到一封电子邮件,等等,是吗?
此外,将整个事物包装在 try...except 中是行不通的,因为这只会捕获在定义类/函数期间(加载/导入模块时)会发生的异常。例如,
# 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()
异常仍未被捕获。
我想你可以自己制作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():
...