微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

twisted.python.failure.Failure的“ value”属性是否具有追溯?如果没有,如何建立回溯?

如何解决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 举报,一经查实,本站将立刻删除。