在Python中处理异常

1 投票
3 回答
570 浏览
提问于 2025-04-16 08:27

处理异常的最佳方法是什么。

class SRException(Exception):
    default_exception = True

    def somefun1(email):
        try:
            user = somefun2(email)
        except Exception, e:
            raise SRException, ("could not find the email", e)

    def somefun2(email):
        try:
            user = User.objects.get(email = email)
        except Exception, e:
            raise SRException, ("could not find the user objecets",e )

当发生异常时,我会看到一长串的异常信息。

UserProfileException('找不到用户或服务对象', UserProfileException('找不到用户', ServicesException('找不到服务', DoesNotExist('没有符合查询的服务。',))))))))

错误和上面的代码示例并不相同。但我想我表达的意思很清楚。

那么,处理异常的最佳方法是什么呢?我是否应该在每个异常中都抛出它?每次发生异常时,我都在给技术团队发邮件。

3 个回答

1

首先,千万不要只检查 Exception!一定要使用你实际期待的正确子类。

另外,你也不应该把已经有用的异常包裹到其他异常里面;一般来说,异常的类型可以用来识别发生了什么问题。这样你就可以在底层不断抛出(有用的)异常,然后在更高的层次上分别捕获它们,以确定给最终用户的正确错误信息。

4

你的异常处理器太宽泛了,应该只捕捉那些你知道能处理的具体异常。捕捉一个异常然后再把它包裹成另一个异常重新抛出是没有意义的;异常对象会带有一个追踪信息,告诉你代码是怎么走到这一步的。最好让异常自然上升,等到在你能处理的地方再去捕捉它。

2

通常情况下,不需要在调用栈的每一层都处理异常。你最好在调用栈的高层捕获异常,然后把错误信息发送到技术支持的邮件里。这样可以清楚地显示出问题发生的地方以及是从哪里调用的。

如果你稍微深入一点,查看一下 sys.exc_info()[2],你甚至可以列出每一层调用中的所有参数和局部变量,这样技术支持人员就能找到出错的邮箱地址。

撰写回答