扭曲有时抛出(看似不完整)'最大递归深度超过'RuntimeError

时间:2009-07-09 15:21:59

标签: python twisted

由于Twisted getPage函数不允许我访问标题,因此我必须编写自己的getPageWithHeaders函数。

def getPageWithHeaders(contextFactory=None, *args, **kwargs):
    try:
        return _makeGetterFactory(url, HTTPClientFactory,
                                  contextFactory=contextFactory,
                                  *args, **kwargs)
    except:
        traceback.print_exc()

这与普通getPage函数完全相同,只是我添加了try / except块并返回工厂对象而不是返回factory.deferred

出于某种原因,我有时会在此处获得最大超出递归深度的错误。它经常在700次中发生几次,通常每次都在不同的站点上。任何人都可以对此有所了解吗?我不清楚为什么或如何发生这种情况,Twisted代码库足够大,我甚至不知道在哪里看。

编辑:这是我得到的追溯,这看起来很奇怪:

Traceback (most recent call last):
  File "C:\keep-alive\utility\background.py", line 70, in getPageWithHeaders
    factory = _makeGetterFactory(url, HTTPClientFactory, timeout=60 , contextFactory=context, *args, **kwargs)
  File "c:\Python26\lib\site-packages\twisted\web\client.py", line 449, in _makeGetterFactory
    factory = factoryFactory(url, *args, **kwargs)
  File "c:\Python26\lib\site-packages\twisted\web\client.py", line 248, in __init__
    self.headers = InsensitiveDict(headers)
RuntimeError: maximum recursion depth exceeded

这是整个追溯,显然不足以超过我们的最大递归深度。为了获得完整的堆栈,我还需要做些什么吗?我以前从未遇到过这个问题;通常当我做

之类的事情时
def f(): return f()
try: f()
except: traceback.print_exc()

然后我得到了你所期望的那种“超出最大递归深度”的堆栈,大量引用f()

3 个答案:

答案 0 :(得分:2)

您正在查看的具体追溯有点神秘。您可以尝试traceback.print_stack而不是traceback.print_exc来查看有问题代码上方的整个堆栈,而不仅仅是堆栈返回到捕获异常的位置。< / p>

如果没有看到更多的追溯,我无法确定,但您可能会遇到the problem where Deferreds will raise a recursion limit exception if you chain too many of them together

如果启用延迟调试(from twisted.internet.defer import setDebugging; setDebugging(True)),在某些情况下可能会获得更多有用的回溯,但请注意,这可能会使服务器运行速度变慢。

答案 1 :(得分:1)

你应该看看你和异常一起得到的追溯 - 它将告诉你哪些函数正在递归得太深,“在_makeGetterFactory下面”。很可能你会发现你自己的getPageWithHeaders参与递归,正是因为它没有正确地返回延迟,而是试图返回一个尚未准备好的工厂。如果您返回延迟退货时会发生什么?

答案 2 :(得分:-1)

URL开启者很可能会追踪301或302重定向的无终结系列。