我似乎经常遇到一个简单的场景:我调用一个可以引发任意数量异常的函数。如果它是一个例外而不是另一个,我不会做任何不同的事情,我只是想记录异常信息并重新提出异常或以其他方式指出某些事情没有按计划进行(例如返回无),否则正常进行。所以我使用了下面显示的某种形式的异常处理。
请注意:
想象一下,他的代码在一个处理消息的守护进程中运行,因此它需要继续运行,即使其中一条消息导致某种异常。
我知道有一条经验法则,一般不建议捕获一般的异常,因为这可能会隐藏应该以不同方式处理的特定错误。 (在其他语言中也是如此。)这种情况不同,因为我不关心引发的异常,处理是一样的。
有更好的方法吗?
def my_func(p1):
retval = None
try:
valx = other_func1(p1)
except Exception as ex:
log.error('other_func1 failed. {}: {}'.format(type(ex).__name__, ex))
else:
retval = ...
return retval
答案 0 :(得分:2)
有更好的方法吗?
怀疑它,Python有这些内置的基本异常类,所以自己创建一些东西实际上是多余的。如果您以相同的方式处理所有内容,那么使用except
概括Exception
很可能是解决此问题的最佳方法。
此处有一点需要注意: Exception
不是最常见的,您可以从文档中获取:
所有内置的,非系统退出的异常都是从这个类派生的。所有用户定义的异常也应该从该类派生。
因此,它不会捕获所有例外:
In [4]: try:
...: raise SystemExit
...: except Exception as b:
...: print("Catch All")
To exit: use 'exit', 'quit', or Ctrl-D.
An exception has occurred, use %tb to see the full traceback.
SystemExit
其中,请注意,当然是你应该想要的东西。 SystemExit
应退出。但是,如果某些边缘情况需要它,为了捕获系统退出异常,您可以使用 BaseException
,这与异常匹配时一样松散:
In [2]: try:
...: raise SystemExit
...: except BaseException as b:
...: print("Catch All")
Catch All
自行决定使用它,但实际使用它可能没有意义,这种情况似乎并不需要它。我刚刚提到它,因为它是你能得到的最普遍的。我相信你做到这一点的方式绰绰有余。
答案 1 :(得分:-1)
如果您以同样的方式处理它们,那看起来就像抓住它们的好方法。 如果要检查引发了什么类型的异常,可以使用内置函数type
并将结果与异常类(例如,the list of built-in exception types中的一个)进行比较:< /秒>
try:
f()
except Exception as ex:
if type(ex)==ValueError:
handle_valueerror()
else:
handle_other_exception()
如果您以不同方式处理它们,请使用except <SpecificExceptionClass>
。我以前不确定我在想什么。