为了账号安全,请及时绑定邮箱和手机立即绑定

Python:尝试/除整个模块外

Python:尝试/除整个模块外

小怪兽爱吃肉 2021-03-18 16:53:37
我有一个包含函数和一些类的python模块。我的一些同事基本上将此模块用作工具集。我想建立一种错误报告系统,每当有人生成我不处理的异常时,都会发送一封包含该异常信息的电子邮件。这样,我可以不断提高代码的健壮性和我自己的错误消息的帮助范围。这样做是最好的方法,只是在整个模块周围放置一个try / except块?
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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


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


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

仍然没有发现例外。


查看完整回答
反对 回复 2021-03-29
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我想您可以自己制作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(): 

    ...


查看完整回答
反对 回复 2021-03-29
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信