【问题标题】:Python: Try/Except around whole modulePython:尝试/排除整个模块
【发布时间】:2013-05-28 09:27:37
【问题描述】:

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

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

【问题讨论】:

  • 您可能想查看logging 模块。这样您就可以将异常记录到文件中,然后使用日志文件的内容发送电子邮件。
  • 只有在模块加载期间出现异常时,您才会收到电子邮件。这看起来不像你想要的。

标签: python exception try-catch


【解决方案1】:

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

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

此外,将整个内容包装在 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()

异常仍未被捕获。

【讨论】:

  • 如果他在维护他的代码,那些愚蠢的小案例最终会得到检查(防止异常),并且随着时间的推移应该会有更少的电子邮件。您可以在活跃的开发环境中关闭电子邮件并将其打开以进行生产。
  • @vol7ron 应该如何改进int() 在传递时不抛出异常'zzz'
  • 如果这是一个问题,我想你有很多选择:(1) 添加值/类型检查,(2) 强制默认值,(3) 转换值或修复错误。基本上,做任何需要做的事情来避免异常冒泡到邮件程序。在您的情况下,在将参数作为值传递给 int() 之前,将对参数添加一个检查
【解决方案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(): 
    ...

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 2018-08-09
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2016-10-31
    • 2018-01-03
    相关资源
    最近更新 更多