我正在阅读一些包含类似于以下功能的源代码:
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
我注意到在这两种情况下打印输出的排列略有不同,但在我看来,第二种方法基本相同且不那么冗长。还是我遗漏了什么?
最佳答案
不,您的代码不等价,原因如下:
- 空白的
except:
捕获所有 异常,包括那些从BaseException
派生的异常(SystemExit
,KeyboardInterrupt
和GeneratorExit
); catchingException
过滤掉那些您通常希望在不重新引发的情况下避免捕获的异常。在较旧的 Python 版本中,它还会捕获字符串异常(不再允许)。 except Exception as e
捕获子类,然后引发一个新的Exception()
实例;在下游try...except
语句中不能再使用特定类型信息。- 在 Python 3 中,从异常处理程序引发新的异常会创建一个异常链(其中原始异常作为
Exception.__context__
属性添加,请参阅 Python "raise from" usage) - 消息已更新;这可能就是这里的重点,就是给异常一个不同的信息。
您找到的代码是..相当糟糕的做法。顶级异常处理程序应该只捕获并打印一条消息,也许还有一个回溯,而不是使用新消息重新引发异常(并且在 Python 2 中丢失有关原始异常的所有信息,在 Python 3 中使其无法访问异常在以后的处理程序中匹配)。
关于python - 在 Python 中使用 "except Exception"与 "except ... raise",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40280776/