python - 在 Python 中使用 "except Exception"与 "except ... raise"

标签 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

我注意到在这两种情况下打印输出的排列略有不同,但在我看来,第二种方法基本相同且不那么冗长。还是我遗漏了什么?

最佳答案

不,您的代码不等价,原因如下:

  • 空白的except: 捕获所有 异常,包括那些从BaseException 派生的异常(SystemExit, KeyboardInterruptGeneratorExit); catching Exception 过滤掉那些您通常希望在不重新引发的情况下避免捕获的异常。在较旧的 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/

相关文章:

python - SPOJ - acode - Python 3 中的 NZEC 错误

python - 如何按特定顺序重新排列 Numpy 数组?

python - imp 模块已弃用,取而代之的是 importlib

c# - VS Debugger 错了吗?代码: f++抛出的IndexOutOfRangeException

c# - VLC.DotNet 上找不到目录异常或 FileNotFoundException

python - 如何在 unstack 过程中使用自定义列名称并更改结构?

android - 从服务向 Activity 抛出自定义异常

C# 等同于 Java 的 Exception.printStackTrace()?

java - 静态映射的空指针异常

python - 如何将误差线添加到数据框分组条形图甚至数组分组条形图?