【问题标题】:How to report an exception for later如何报告异常以备后用
【发布时间】:2018-07-31 13:06:15
【问题描述】:

我有一个 python 文件,其中有两个函数,每个函数都会引发异常。

def f():
    raise e1

def g():
    raise e2

我的问题,是否可以将这些异常存储在一个变量中,例如列表--[e1, e2]--,以便控制在另一个函数中执行异常的顺序,例如 h?

【问题讨论】:

  • 异常是发生了错误。他们通过跳转到最近的except 立即响应来中断执行流程。我不确定您是否正确使用它们。
  • 你对@ReutSharabani。但在我的情况下,我正在为某种语言实现解释器,当我测试它时,我注意到它是最后一个错误的东西,它在第一个错误之前首先被提出。原因是,我用来构建解释器的工具是 LALR 类型(左看右)。这就是为什么我要控制异常...

标签: python exception raise


【解决方案1】:

异常是对象,就像 Python 中的大多数东西一样;具体来说,您可以在捕获时将其绑定到名称,然后将其添加到列表中。例如:

exceptions = []
try:
    f()
except Exception as f_exc:
    exceptions.append(f_exc)

try:
    g()
except Exception as g_exc:
    exceptions.append(g_exc)

我不确定您想要存储异常以供以后查看的用例。通常,您会在捕获到异常后立即对其进行处理。

【讨论】:

  • 我学到了一些东西@chepner,谢谢。日志记录是记录异常的首选选项吗?
  • 感谢您的帮助。这正是我所需要的
【解决方案2】:

正如 chepner 指出的,异常是对象。如果你以后想以相同的顺序处理它们(甚至可能是不同的线程),你应该将它们存储在一个队列中:

import Queue

exceptions = Queue.Queue()

try:
    f()
except Exception as e:
    exceptions.put(e)

然后您可以让另一个线程访问同一变量 exceptions 并处理(或记录)它们:

while True:
    while not exceptions.empty():
        do_sth_with_exception(exceptions.get())

【讨论】:

  • 为什么是队列而不是常规列表?
  • 队列的资源效率更高。此外,它们具有易于使用的线程安全实现。
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2023-04-02
相关资源
最近更新 更多