使用"除了异常" vs."除了...提高"在Python中

时间:2016-10-27 09:19:46

标签: python exception

我正在阅读一些包含类似以下功能的源代码:

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

我注意到在任何一种情况下打印输出的排列都略有不同,但在我看来,第二种方法基本相同且不那么冗长。或者我错过了什么?

1 个答案:

答案 0 :(得分:8)

不,您的代码不相同,原因如下:

  • 空白except:捕获所有例外情况,包括BaseExceptionSystemExitKeyboardInterruptGeneratorExit来自的例外情况;捕获Exception过滤掉那些您通常希望避免在没有重新加注的情况下捕获的异常。在较旧的Python版本中,它还会捕获字符串异常(不再允许)。
  • except Exception as e捕获子类,但随后会引发一个新的Exception()实例;在下游try...except语句中不能再使用特定类型信息。
  • 在Python 3中,从异常处理程序中引发新异常会创建一个异常链(将原始异常添加为Exception.__context__属性,请参阅Python "raise from" usage
  • 消息已更新;这可能是重点,就是给异常一个不同的消息。

你找到的代码是......相当糟糕的做法。顶级异常处理程序应该只捕获并打印消息并且可能是回溯,而不是使用新消息重新引发异常(并且在Python 2中丢失了有关原始异常的所有信息,在Python 3中使其无法访问异常在以后的处理程序中匹配)。