当前位置: 首页 > 面试题库 >

如果不立即引发异常回溯,则将其隐藏

党航
2023-03-14
问题内容

我有一段类似于以下的代码:

import sys

def func1():
    func2()

def func2():
    raise Exception('test error')

def main():
    err = None

    try:
        func1()
    except:
        err = sys.exc_info()[1]
        pass

    # some extra processing, involving checking err details (if err is not None)

    # need to re-raise err so caller can do its own handling
    if err:
        raise err

if __name__ == '__main__':
    main()

func2引发异常时,我会收到以下回溯:

Traceback (most recent call last):
  File "err_test.py", line 25, in <module>
    main()
  File "err_test.py", line 22, in main
    raise err
Exception: test error

从这里我看不到异常的来源。原始回溯丢失。

如何保留原始回溯并重新提出?我想看类似的东西:

Traceback (most recent call last):
  File "err_test.py", line 26, in <module>
    main()
  File "err_test.py", line 13, in main
    func1()
  File "err_test.py", line 4, in func1
    func2()
  File "err_test.py", line 7, in func2
    raise Exception('test error')
Exception: test error

问题答案:

空白raise引发最后一个异常。

# need to re-raise err so caller can do its own handling
if err:
    raise

如果您使用raise somethingPython,则无法知道something是之前捕获的异常还是带有新堆栈跟踪的新异常。这就是为什么有空白raise保留堆栈跟踪的原因。

这里参考



 类似资料:
  • 在以下代码中: 如果过滤器的结果是大小为0的列表(即没有项目通过过滤器),我如何抛出?

  • 问题内容: 我正在研究一个第三方开发人员用来为我们的核心应用程序编写扩展的Python库。 我想知道引发异常时是否可以修改回溯,因此最后一个堆栈帧是对开发人员代码中库函数的调用,而不是对引发异常的库中的行的调用。堆栈底部还有一些框架,其中包含对第一次加载我理想上也希望删除的代码时使用的函数的引用。 在此先感谢您的任何建议! 问题答案: 不更改回溯怎么办?您要求的两件事都可以通过不同的方式轻松完成。

  • 问题内容: 在Python框架中,如果没有引发异常,是否有一种方法可以通过单元测试,否则会因AssertRaise而失败? 问题答案: 如果我正确理解了您的问题,则 可以 执行以下操作: …假设您有一个相应的测试,可以正确地针对无效输入进行测试,当然: 但是,正如评论中指出的那样,您需要考虑 实际 测试的内容。像…这样的测试可能 …更好,因为它测试系统所需的行为,如果一个异常失败 的 提高。

  • 问题内容: 如何记录我的Python错误? 问题答案: 在处理程序/块中使用,可将当前异常与跟踪信息一起记录在日志中,并附带一条消息。 现在查看日志文件:

  • Supporting Functions # traceback_example.py import traceback import sys def produce_exception(recursion_level=2): sys.stdout.flush() if recursion_level: produce_exception(recursion_l

  • “异常信息” 在WebDriver.dll中发生类型为“System.InvalidOperationException”的未处理异常 附加信息:没有这样的驱动程序(NoSuchDriver) OpenQa.Selenium.edge.EdgedRiver..ctor(字符串edgeDriverDirectory,EdgeOptions选项) ConsoleApplication.Program.

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 问题内容: 我正在使用一个API,该API声称如果成功则返回true,如果失败则返回false。但是,它也声称如果失败,则抛出不同的异常。它如何返回false并引发异常? 问题答案: 不能从单个函数调用中引发异常并返回值。 如果发生错误,它可能会执行类似返回的操作,但是如果输入无效,则会引发异常。 编辑:PaulPRO发布了一个(现已删除)答案,指出从 技术上讲, 有可能在返回当前值时在另一个线程