在Python中处理异常
处理异常的最佳方法是什么。
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]
,你甚至可以列出每一层调用中的所有参数和局部变量,这样技术支持人员就能找到出错的邮箱地址。