如何解决twisted.python.failure.Failure的“ value”属性是否具有追溯?如果没有,如何建立回溯?
我有一个依赖于Scrapy 2.3.0的项目,该项目使用Twisted 20.3.0作为其网络引擎。我正在尝试将Scrapy使用的基于回调的方法转换为协程,并使用Python的asyncio运行它。要发出HTTP请求,需要创建一个新的Request对象,该对象带有一个pip install -U scipy
处理一个成功案例,一个callback
处理失败。因此,我编写了以下方法进行转换:
errback
但是当引发异常时,我只得到import asyncio
from scrapy import http
# ...
async def request(
self,url: str,method: str,*,headers: dict = None,cookies: dict = None,body: str = None,Meta: dict = None
) -> http.Response:
fut = asyncio.get_running_loop().create_future()
def fire_success(response):
if not fut.done():
fut.set_result(response)
return None
def fire_failure(failure):
if not fut.done():
fut.set_exception(failure.value)
return None
scrapy_request = http.Request(
url,method=method,headers=headers,cookies=cookies,body=body,Meta=Meta,callback=fire_success,errback=fire_failure,dont_filter=True
)
self._crawler.engine.crawl(scrapy_request,self._crawler.spider)
return await fut
之前的回溯,这是否意味着return await fut
被设置在
failure.value
没有回溯吗?
以下示例重现了该问题:
def fire_failure(failure):
if not fut.done():
fut.set_exception(failure.value)
return None
我通过调用import asyncio
async def a():
await asyncio.sleep(2)
raise Exception('Hello from a()')
async def b():
await a()
async def c(fut: asyncio.Future):
try:
await b()
except Exception as e:
fut.set_exception(e.with_traceback(None))
async def d(fut):
return await fut
async def main():
fut = asyncio.get_running_loop().create_future()
await asyncio.gather(d(fut),c(fut))
asyncio.run(main())
删除了回溯,这是不完整的回溯(它缺少对e.with_traceback(None)
的调用):
await b()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。