kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn

Как возобновить работу скрипта при Exception in thread?

Бот, основанный на vk_api, на сервере запускается через systemd. Ночью происходит перезагрузка интернет-соединения на сервере и в логах было так:
2019-05-05 00:55:06,570:DEBUG:HTTPSConnectionPool(host='lp.vk.com', port=443): Read timed out. (read timeout=35)

На гите проблема уже подымалась, ее решение следующее: унаследовать основной класс от VkBotLongPoll и переопределить метод прослушивания событий от ВК следующим образом:
def listen(self):
        while True:
            try:
                for event in self.check():
                    yield event
            except Exception as e:
                logging.error(e)

Ночью снова был перезапуск интернет - бот снова лежит, но в логах теперь пустота. Запустил бота локально, отключил интернет, в консоли следующее:
Traceback
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Python37\lib\site-packages\urllib3\connectionpool.py", line 384, in _make_request
six.raise_from(e, None)
File "", line 2, in raise_from
File "C:\Python37\lib\site-packages\urllib3\connectionpool.py", line 380, in _make_request
httplib_response = conn.getresponse()
File "C:\Python37\lib\http\client.py", line 1321, in getresponse
response.begin()
File "C:\Python37\lib\http\client.py", line 296, in begin
version, status, reason = self._read_status()
File "C:\Python37\lib\http\client.py", line 257, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "C:\Python37\lib\socket.py", line 589, in readinto
return self._sock.recv_into(b)
File "C:\Python37\lib\ssl.py", line 1052, in recv_into
return self.read(nbytes, buffer)
File "C:\Python37\lib\ssl.py", line 911, in read
return self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Python37\lib\site-packages\requests\adapters.py", line 449, in send
timeout=timeout
File "C:\Python37\lib\site-packages\urllib3\connectionpool.py", line 638, in urlopen
_stacktrace=sys.exc_info()[2])
File "C:\Python37\lib\site-packages\urllib3\util\retry.py", line 367, in increment
raise six.reraise(type(error), error, _stacktrace)
File "C:\Python37\lib\site-packages\urllib3\packages\six.py", line 686, in reraise
raise value
File "C:\Python37\lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen
chunked=chunked)
File "C:\Python37\lib\site-packages\urllib3\connectionpool.py", line 386, in _make_request
self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
File "C:\Python37\lib\site-packages\urllib3\connectionpool.py", line 306, in _raise_timeout
raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='lp.vk.com', port=443): Read timed out. (read timeout=25)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Python37\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "C:\Python37\lib\threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "D:\Develop\vk_image_bot\main.py", line 78, in input_event
for event in self.long_poll.listen():
File "C:\Python37\lib\site-packages\vk_api\bot_longpoll.py", line 274, in listen
for event in self.check():
File "C:\Python37\lib\site-packages\vk_api\bot_longpoll.py", line 246, in check
timeout=self.wait + 10
File "C:\Python37\lib\site-packages\requests\sessions.py", line 546, in get
return self.request('GET', url, **kwargs)
File "C:\Python37\lib\site-packages\requests\sessions.py", line 533, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python37\lib\site-packages\requests\sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
File "C:\Python37\lib\site-packages\requests\adapters.py", line 529, in send
raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='lp.vk.com', port=443): Read timed out. (read timeout=25)

Основная проблема в том, что бот работает в несколько потоков, по-этому когда возникает подобная ошибка скрипт не прекращает свою работу, systemd его не перезапускает и скрипт остается "висеть" пока его не перезапустить вручную.
  • Вопрос задан
  • 640 просмотров
Решения вопроса 1
tumbler
@tumbler Куратор тега Python
бекенд-разработчик на python
Если сделать все потоки "демонами" Thread(daemon=True), то sys.exit из любого потока будет завершать остальные потоки тоже. Как "заплатка" пойдет, но вообще стоит подумать над переинициализацией и повторным запуском обработчика в любой непонятной ситуации.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы