处理python中的异常

时间:2010-12-13 11:16:30

标签: python django

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

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 )

因此,当异常发生时,我会得到一个很长的Exception列表

  

UserProfileException('找不到   用户或服务对象',   UserProfileException('找不到   用户',ServicesException('可以   找不到服务',   DoesNotExist('服务匹配查询   不存在。',))))))))

错误和上面的代码示例不一样。但我想我明确表达了我的观点。

那么处理异常的最佳方法是什么。 我不应该在每个例外中提出它。每次发生异常时,我都会向技术团队发送邮件。

3 个答案:

答案 0 :(得分:4)

您的异常处理程序过于宽泛,仅捕获您知道可以处理的特定异常。捕获异常只是为了将它包装在另一个异常中并重新提升它是没有意义的;异常对象带有一个Traceback,它将显示代码的路径。只需让异常冒泡,然后将其捕获到可以从异常中恢复的级别。

答案 1 :(得分:2)

通常不需要在调用堆栈的每个级别包装异常。最好在调用堆栈中的高位捕获异常并将堆栈跟踪转储到技术支持电子邮件中。这将非常清楚地表明问题发生的位置以及问题的来源。

sys.exc_info()[2]中进行一些挖掘,您甚至可以在每个堆栈框架中转储完整的参数和本地列表,这将为支持人员提供有问题的电子邮件地址。

答案 2 :(得分:1)

首先,不要只检查Exception!始终使用您实际期望的正确子类型。

此外,您不应将已经有用的异常封装到其他异常中;并且通常使用异常的类型作为发生情况的标识。然后你可以简单地在低级别抛出(信息性)异常,并在更高级别单独捕获它们,以确定最终用户的正确错误消息。