Скрипт Python аварийно завершает работу, когда не удается подключиться к серверу

#python #python-3.x #python-requests

Вопрос:

Я тестирую свой скрипт на Python, и когда сервер выключается, мой скрипт выходит из строя. Как я могу это изменить, чтобы снова установить связь. Теперь мой скрипт выходит из строя, когда ему не удается подключиться к серверу. Вот мой сценарий:

 import urllib.request
import json


def connectToServer():
    with urllib.request.urlopen("http://localhost:5000/user/connect") as url:
        data = json.loads(url.read().decode())
 

Вот ошибка:

 Traceback (most recent call last):
  File "C:UsersRostikAppDataLocalProgramsPythonPython39liburllibrequest.py", line 1346, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "C:UsersRostikAppDataLocalProgramsPythonPython39libhttpclient.py", line 1255, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:UsersRostikAppDataLocalProgramsPythonPython39libhttpclient.py", line 1301, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:UsersRostikAppDataLocalProgramsPythonPython39libhttpclient.py", line 1250, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:UsersRostikAppDataLocalProgramsPythonPython39libhttpclient.py", line 1010, in _send_output
    self.send(msg)
  File "C:UsersRostikAppDataLocalProgramsPythonPython39libhttpclient.py", line 950, in send
    self.connect()
  File "C:UsersRostikAppDataLocalProgramsPythonPython39libhttpclient.py", line 921, in connect
    self.sock = self._create_connection(
  File "C:UsersRostikAppDataLocalProgramsPythonPython39libsocket.py", line 843, in create_connection
    raise err
  File "C:UsersRostikAppDataLocalProgramsPythonPython39libsocket.py", line 831, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "e:ProjectsHacker_Pro Pythonmain.py", line 4, in <module>
    server.connectToServer()
  File "e:ProjectsHacker_Pro Pythonserver.py", line 8, in connectToServer
    with urllib.request.urlopen("http://localhost:5000/user/connect") as url:
  File "C:UsersRostikAppDataLocalProgramsPythonPython39liburllibrequest.py", line 214, in urlopen
    return opener.open(url, data, timeout)
  File "C:UsersRostikAppDataLocalProgramsPythonPython39liburllibrequest.py", line 517, in open
    response = self._open(req, data)
  File "C:UsersRostikAppDataLocalProgramsPythonPython39liburllibrequest.py", line 534, in _open
    result = self._call_chain(self.handle_open, protocol, protocol  
  File "C:UsersRostikAppDataLocalProgramsPythonPython39liburllibrequest.py", line 494, in _call_chain
    result = func(*args)
  File "C:UsersRostikAppDataLocalProgramsPythonPython39liburllibrequest.py", line 1375, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "C:UsersRostikAppDataLocalProgramsPythonPython39liburllibrequest.py", line 1349, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение>
 

Комментарии:

1. В чем ошибка?

2. Извините, я забыл добавить стек ошибок. Я редактирую свой вопрос

Ответ №1:

Инструкция python try может вам помочь.

 def connectToServer():
    try:
        with urllib.request.urlopen("http://localhost:5000/user/connect") as url:
            data = json.loads(url.read().decode())

    except ConnectionRefusedError as error:
        print('connection was refused:n{}'.format(error))

    except:
        print('could not connect to server')
 

Комментарии:

1. Никогда не используйте except: . Если вам нужно перехватить все регулярные выражения, except Exception: .

2. Насколько я понимаю, except Exception: это делается только для того, чтобы вы могли ссылаться на исключение в заявлении, что может быть очень полезно. Иногда, однако, вполне приемлемо напечатать читаемое заявление о том, что не удалось, вместо того, чтобы сосредоточиться на том, почему это не удалось. У меня нет законной причины «никогда» использовать except: ?