"行是什么意思?-6ren"> "行是什么意思?-例如: Unhandled error in Deferred: Unhandled Error Traceback (most recent call last): File "/opt/zen-6ren">
gpt4 book ai didi

python - 扭曲回溯中的 ""行是什么意思?

转载 作者:行者123 更新时间:2023-12-01 05:24:47 24 4
gpt4 key购买 nike

例如:

Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
File "/opt/zenoss/lib/python/twisted/internet/defer.py", line 388, in errback
self._startRunCallbacks(fail)
File "/opt/zenoss/lib/python/twisted/internet/defer.py", line 455, in _startRunCallbacks
self._runCallbacks()
File "/opt/zenoss/lib/python/twisted/internet/defer.py", line 542, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/opt/zenoss/lib/python/twisted/internet/defer.py", line 1076, in gotResult
_inlineCallbacks(r, g, deferred)
--- <exception caught here> ---
File "/opt/zenoss/lib/python/twisted/internet/defer.py", line 1018, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File "/opt/zenoss/lib/python/twisted/python/failure.py", line 352, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
exceptions.TypeError: exceptions must be classes, or instances, not str

如果它在那里被捕获,为什么它仍然在下面传播两帧?以及如何找出它是从哪里扔的?

最佳答案

这实际上并不是回溯。这就是twisted.python.failure.Failure “打印”本身(尽管为了确保事情是不明确的,执行此操作的方法是 printTraceback )。

该行的原因--- <exception caught here> ---位于中间的是它划分了与异常相关的调用堆栈的两个不同部分相关的信息。

在标记上方,堆栈帧描述了决定创建 Failure 的异常处理程序上方的内容。实例(来自异常和回溯状态)。

例如,考虑这个简单的程序:

from twisted.python.failure import Failure

def a():
b()

def b():
try:
c()
except:
return Failure()

def c():
1 / 0

f = a()
f.printTraceback()

如果您运行此命令,您将在标记线上方看到:

File "someprog.py", line 16, in <module>
f = a()
File "someprog.py", line 5, in a
return b()

如果调用堆栈是一个堆栈,那么您可以看到这些是在捕获异常并创建 Failure 的帧之前被插入其中的两个帧。 .

在标记线下方您会看到:

File "someprog.py", line 9, in b
c()
File "someprog.py", line 14, in c
1 / 0

这些是调用堆栈上的两个帧,并因引发异常而弹出。

大多数情况下,只有标记下方的帧才是有趣的。标记上方的帧以这种格式分隔,因为它们通常是 Twisted 某些部分的深层实现细节。由于 Twisted 是一个协作式多任务系统,因此实现中的堆栈帧通常不会告诉您太多有关异常上下文的有用信息(因为 Python 中的协作式多任务系统无法保持正在处理的逻辑操作与正在处理的逻辑操作之间的对应关系)。正在执行处理的 Python 框架对象)。

除此之外,由于涉及的代码使用 inlineCallbacks,理解回溯变得更加复杂。 。这会在调用堆栈上发挥更多的作用,并且通常会破坏您得到的任何回溯。

File "/opt/zenoss/lib/python/twisted/internet/defer.py", line 1018, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File "/opt/zenoss/lib/python/twisted/python/failure.py", line 352, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
exceptions.TypeError: exceptions must be classes, or instances, not str

但是,我注意到这是尝试通过实现 inlineCallbacks 向生成器引发异常。这本身就引发了另一个异常。

这个TypeError意味着self.typestr 的一个实例。由此我猜测涉及的一些代码被误用 Failure或者该应用程序正在使用 Twisted Spread (误用 Failure )。我想在这里给出的简短答案是不要将 Twisted Spread 和 inlineCallbacks 结合起来。 :它们不能很好地协同工作。

由于我在路径中看到 Zenoss,我怀疑您没有编写大部分代码,因此这个答案可能对您没有太大帮助......

如果可以的话,并且如果 Twisted Spread 确实参与其中,您可以尝试升级 Twisted 以查看此问题是否消失。我认为这是http://tm.tl/4520的症状几年前已修复(修复首先包含在 Twisted 11.1.0 中)。

如果不涉及 Twisted Spread,那么您可能需要追踪其他错误使用 Failure 的代码。并纠正它。

关于python - 扭曲回溯中的 "<exception caught here>"行是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21610078/

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