Python Twisted有时抛出(似乎不完整)';超过最大递归深度';访问违例

Python Twisted有时抛出(似乎不完整)';超过最大递归深度';访问违例,python,twisted,Python,Twisted,因为TwistedgetPage函数不允许我访问标题,所以我必须编写自己的getPageWithHeaders函数 def getPageWithHeaders(contextFactory=None, *args, **kwargs): try: return _makeGetterFactory(url, HTTPClientFactory, contextFactory=contextFactory

因为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对象,而不是返回factory.deferred

出于某种原因,我有时会在这里得到一个最大递归深度超过错误。在700个站点中,这种情况经常发生几次,每次通常发生在不同的站点上。有人能解释一下吗?我不清楚为什么会发生这种情况,或者是如何发生的,而且扭曲的代码库太大了,我甚至不知道该去哪里查找

编辑:这是我得到的回溯,看起来奇怪地不完整:

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()

,您应该查看与异常一起进行的回溯——这将告诉您什么函数递归太深,“
\u makeGetterFactory
下面”。您很可能会发现递归中涉及到您自己的
getPageWithHeaders
,这正是因为它没有正确地返回延迟,而是试图返回一个尚未准备好的工厂。如果返回延迟的重定向,会发生什么情况?

URL开启器可能会执行一系列未结束的301或302重定向。

您正在查看的特定回溯有点神秘。您可以尝试
traceback.print_stack
而不是
traceback.print_exc
查看问题代码上方的整个堆栈,而不仅仅是返回异常捕获位置的堆栈

没有看到更多你的追踪,我不能肯定,但你可能会遇到


如果启用延迟调试(
,从twisted.internet.defer import setdebuging;setdebuging(True)
),在某些情况下,您可能会得到更有用的回溯,但请注意,这也可能会使您的服务器速度慢很多。

我已将回溯添加到我的问题中。至于回到getPage,有趣的是,我有时调用getPage,有时调用getPageWithHeaders,getPage从来没有出现过这个问题。所以我猜我的函数是造成这个问题的原因,虽然我不知道是怎么回事。仅供参考:makeGetterFactory前面的“\uu”表示“不要调用这个”。这是一个私有的实现细节。如果安装Twisted的新版本,它将在没有警告的情况下中断。