Python Twisted有时抛出(似乎不完整)';超过最大递归深度';访问违例
因为TwistedPython Twisted有时抛出(似乎不完整)';超过最大递归深度';访问违例,python,twisted,Python,Twisted,因为TwistedgetPage函数不允许我访问标题,所以我必须编写自己的getPageWithHeaders函数 def getPageWithHeaders(contextFactory=None, *args, **kwargs): try: return _makeGetterFactory(url, HTTPClientFactory, contextFactory=contextFactory
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的新版本,它将在没有警告的情况下中断。