gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:02:36 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com