ConnectionResetError с модулем запросов вызывает исключение внутри исключения, вылетает программа - PullRequest
1 голос
/ 22 января 2020

Исключение, которое приводит к сбою моей программы, таково:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 397, in _error_catcher
    yield
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 479, in read
    data = self._fp.read(amt)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 447, in read
    n = self.readinto(b)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 491, in readinto
    n = self.fp.readinto(b)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py", line 589, in readinto
    return self._sock.recv_into(b)
ConnectionResetError: [Errno 54] Connection reset by peer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/models.py", line 750, in generate
    for chunk in self.raw.stream(chunk_size, decode_content=True):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 531, in stream
    data = self.read(amt=amt, decode_content=decode_content)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 496, in read
    raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 415, in _error_catcher
    raise ProtocolError('Connection broken: %r' % e, e)
urllib3.exceptions.ProtocolError: ("Connection broken: ConnectionResetError(54, 'Connection reset by peer')", ConnectionResetError(54, 'Connection reset by peer'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/me/Documents/CBB/scrape.py", line 301, in <module>
    main([2018, 11, 6, 2018, 12, 1])
  File "/Users/me/Documents/CBB/scrape.py", line 207, in main
    get_range(int(argv[0]), int(argv[1]), int(argv[2]), int(argv[3]), int(argv[4]), int(argv[5]))
  File "/Users/me/Documents/CBB/scrape.py", line 250, in get_range
    rg.get_bsc()
  File "/Users/me/Documents/CBB/scrape.py", line 103, in get_bsc
    self.get_pbp()
  File "/Users/me/Documents/CBB/scrape.py", line 120, in get_pbp
    soup = self.scraper.open_page(url=url)
  File "/Users/me/Documents/CBB/scrape_util.py", line 209, in open_page
    response = self.session.get(url, proxies={'https': ip, 'http': ip}, headers=headers)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py", line 546, in get
    return self.request('GET', url, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py", line 686, in send
    r.content
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/models.py", line 828, in content
    self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b''
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/models.py", line 753, in generate
    raise ChunkedEncodingError(e)
requests.exceptions.ChunkedEncodingError: ("Connection broken: ConnectionResetError(54, 'Connection reset by peer')", ConnectionResetError(54, 'Connection reset by peer'))

Я запускаю webscraper из места, где Inte rnet иногда отключается на секунду или две одновременно, и в этих случаях я ожидаю получить какое-то исключение. Мой подход к этим исключениям состоит в том, чтобы подождать пару секунд и повторить попытку доступа к странице. Для большинства типов исключений, вызывающих эту проблему, я могу легко except исключить и повторить попытку. Однако всякий раз, когда это приводит к ConnectionResetError, программа падает из-за исключений, возникающих внутри обработчиков исключений. Я не знаю, как это исправить, потому что ни один из кодов, вызывающих исключения, не написан мной. Я не выдвигаю никаких исключений, и я хотел бы подавить все это, чтобы я мог повторить попытку. Есть ли способ игнорировать эти сбои исключений внутри исключения?

Я уже исключаю ConnectionResetError с и ухожу от них как можно быстрее, что не работает. Я использую модуль запросов, чтобы открыть эти страницы.

1 Ответ

0 голосов
/ 29 марта 2020

У вас есть 3 различных исключения, которые происходят в следующем порядке:

  1. ConnectionResetError
  2. urllib3.exceptions.ProtocolError
  3. requests.exceptions.ChunkedEncodingError

Первые два исключения исключены в библиотеках, которые вы используете, и вы не должны заботиться о них. Последний (requests.exceptions.ChunkedEncodingError) не исключается, и, поскольку вы тоже не исключаете его, он поднимается. Таким образом, вы должны иметь:

except requests.exceptions.ChunkedEncodingError:
    # retry like you do for other exceptions

Чтобы проиллюстрировать, что происходит, проверьте этот код:

def external_function():
    try:
        1 / 0    #  this produces ZeroDivisionError
    except ZeroDivisionError:
        a = b    #  this produces NameError

try:
    external_function()
except ZeroDivisionError:
    print('This line is never printed')
except NameError:
    print('NamerError is caught')

external_function() иллюстрирует requests.get(). Во-первых, возникает ошибка ZeroDivisionError. Однако он не вызывается, потому что обрабатывается каким-то внешним кодом. Во время обработки этого исключения внешний код создает другое исключение, на этот раз NameError. Это исключение не обрабатывается внешним кодом, поэтому оно возвращается вам. Тогда решать вам. Если вы не обрабатываете его, он поднимается и печатает трассировку всех исключений, которые возникли на этом пути, даже если они были исключены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...