我正在阅读一些包含类似以下功能的源代码:
def dummy_function():
try:
g = 1/0
except Exception as e:
raise Exception("There is an error: {}".format(e))
据我了解,所有异常都来自Exception类,因此这应该捕获所有错误。然后,在https://docs.python.org/3/tutorial/errors.html之后,这不等同于
def dummy_function():
try:
g = 1/0
except:
print "There is an error:"
raise
我注意到在任何一种情况下打印输出的排列都略有不同,但在我看来,第二种方法基本相同且不那么冗长。或者我错过了什么?
答案 0 :(得分:8)
不,您的代码不相同,原因如下:
except:
捕获所有例外情况,包括BaseException
(SystemExit
,KeyboardInterrupt
和GeneratorExit
来自的例外情况;捕获Exception
过滤掉那些您通常希望避免在没有重新加注的情况下捕获的异常。在较旧的Python版本中,它还会捕获字符串异常(不再允许)。except Exception as e
捕获子类,但随后会引发一个新的Exception()
实例;在下游try...except
语句中不能再使用特定类型信息。Exception.__context__
属性,请参阅Python "raise from" usage)你找到的代码是......相当糟糕的做法。顶级异常处理程序应该只捕获并打印消息并且可能是回溯,而不是使用新消息重新引发异常(并且在Python 2中丢失了有关原始异常的所有信息,在Python 3中使其无法访问异常在以后的处理程序中匹配)。