Как я могу игнорировать ошибку SL асинхронного в Python? - PullRequest
0 голосов
/ 26 ноября 2018

поэтому мой код выглядит так:

tasks = [asyncio.ensure_future(self.run(proxy)) for proxy in proxy_list]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
res = [task.result() for task in tasks if task.result()]


async def run(self, proxy):
    async with aiohttp.ClientSession() as session:
        try:
            async with session.get(url='https://www.google.com', proxy=proxy,
                                   headers=self.get_headers(), timeout=5) as resp:
                return proxy
        except Exception as e:
            return None

Иногда выдает ошибку SL:

SL error in data received
protocol: <asyncio.sslproto.SSLProtocol object at 0x04CBEFB0>
transport: <_SelectorSocketTransport fd=2020 read=polling write=<idle, bufsize=0>>
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python\lib\asyncio\sslproto.py", line 526, in data_received
ssldata, appdata = self._sslpipe.feed_ssldata(data)
  File "C:\Program Files (x86)\Python\lib\asyncio\sslproto.py", line 207, in feed_ssldata
self._sslobj.unwrap()
  File "C:\Program Files (x86)\Python\lib\ssl.py", line 767, in unwrap
return self._sslobj.shutdown()
ssl.SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption failed or bad record mac (_ssl.c:2592)

Поэтому я хочу игнорировать это сообщение об ошибке, чтобы оно не было напечатано.но похоже это не возможно?Я даже пытался попробовать / исключить весь блок задач и циклов, но это не сработало.Он возвращает «AttributeError: объект _GeneratorContextManager» не имеет атрибута «run_until_complete» »

Я попытался переделать, поэтому код выглядит так:

@contextlib.contextmanager
def suppress_ssl_exception_report(self):
    loop = asyncio.get_event_loop()
    old_handler = loop.get_exception_handler()
    old_handler_fn = old_handler or (lambda _loop, ctx: loop.default_exception_handler(ctx))

    def ignore_exc(_loop, ctx):
        exc = ctx.get('exception')
        if isinstance(exc, SSLCertVerificationError):
            return
        old_handler_fn(loop, ctx)

    loop.set_exception_handler(ignore_exc)
    try:
        yield
    finally:
        loop.set_exception_handler(old_handler)
    return loop


tasks = [asyncio.ensure_future(self.run(proxy)) for proxy in proxy_list]
loop = self.suppress_ssl_exception_report()
loop.run_until_complete(asyncio.wait(tasks))
res = [task.result() for task in tasks if task.result()]
...