Уведомления

Группа в Telegram: присоединиться

#1 Дек. 3, 2019 19:37:56

modsley
Зарегистрирован: 2019-12-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не пойму про try / except

Приветствую.
Что-то я не пойму про try / except

 try:
    with urllib.request.urlopen(self.current_url) as self.current_url:
        data = json.loads(self.current_url.read().decode())
except:
    print('error getting data')

Исключение не обрабатывает. Прога вываливается с ошибкой.
Что я делаю не так?
Спасибо

Отредактировано modsley (Дек. 3, 2019 19:38:14)

Офлайн

#2 Дек. 3, 2019 20:36:12

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 3496
Репутация: +  196  -
Профиль   Отправить e-mail  

Не пойму про try / except

modsley
Что я делаю не так?
1. не приводите сообщение об ошибке.
2. Присылаете неполный фрагмент который невозможно запустить.

p.s.
Проверка синтаксиса очевидно происходит раньше чем исполнение.



Отредактировано doza_and (Дек. 3, 2019 20:44:52)

Офлайн

#3 Дек. 3, 2019 23:21:25

modsley
Зарегистрирован: 2019-12-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не пойму про try / except

Сообщение об ошибке вот.
Сам код большой дюже и для работы ему нужны ключи на API, которые я здесь выложить не могу, а без них он работать не будет.
Вываливается именно на data = json.loads(self.current_url.read().decode())
Собственно я для эксперимента просто даю ему неправильный URL в current_url
Меня в общем-то в логике не интересует, по какой причине оно там вываливается, интернета ли нет или ещё что.
Поднялось исключение, значит не получилось. Это всё, что нужно.
Почему оно не обрабатывает это исключение, не пойму.
Собственно, их два, как я понял из сообщения.
Происходят они здесь

socket.gaierror: getaddrinfo failed

 def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
    addrlist = []
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
        af, socktype, proto, canonname, sa = res
        addrlist.append((_intenum_converter(af, AddressFamily),
                         _intenum_converter(socktype, SocketKind),
                         proto, canonname, sa))
    return addrlist

urllib.error.URLError: <urlopen error getaddrinfo failed>
         try:
            try:
                h.request(req.get_method(), req.selector, req.data, headers,
                          encode_chunked=req.has_header('Transfer-encoding'))
            except OSError as err: # timeout error
                raise URLError(err)
            r = h.getresponse()
        except:
            h.close()
            raise


Спасибо

 Traceback (most recent call last):
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 1317, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 1230, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 1276, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 1225, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 1004, in _send_output
    self.send(msg)
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 944, in send
    self.connect()
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 915, in connect
    self.sock = self._create_connection(
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\socket.py", line 787, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\socket.py", line 914, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11004] getaddrinfo failed
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "C:/Users/msmolkin/YandexDisk/ws/ws3.py", line 308, in <module>
    window()
  File "C:/Users/msmolkin/YandexDisk/ws/ws3.py", line 295, in window
    win = MainWindow()
  File "C:/Users/msmolkin/YandexDisk/ws/ws3.py", line 26, in __init__
    self.initWindow()
  File "C:/Users/msmolkin/YandexDisk/ws/ws3.py", line 201, in initWindow
    self.get_weather()
  File "C:/Users/msmolkin/YandexDisk/ws/ws3.py", line 287, in get_weather
    with urllib.request.urlopen(self.current_url) as self.current_url:
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 525, in open
    response = self._open(req, data)
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 542, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 502, in _call_chain
    result = func(*args)
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 1346, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "C:\Users\msmolkin\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 1320, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 11004] getaddrinfo failed>
Process finished with exit code 1

Офлайн

#4 Дек. 4, 2019 01:49:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 6597
Репутация: +  586  -
Профиль   Отправить e-mail  

Не пойму про try / except

modsley
Исключение не обрабатывает. Прога вываливается с ошибкой.
Что я делаю не так?
Оно всё отлавливает. Просто ты источник исключения неправильно определил. Оно в другом месте происходит, а ты думаешь на это место.



Отредактировано py.user.next (Дек. 4, 2019 01:53:18)

Офлайн

#5 Дек. 4, 2019 11:03:38

modsley
Зарегистрирован: 2019-12-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не пойму про try / except

Ну да, исключение поднимается в другом модуле.
Но как сделать, чтобы основная прога не валилась?
По идее–то, из try я что–то запустил.
Это что–то в свою очередь может ещё десяток модулей использовать.
В каком–то из них поднялось исключение.
Почему основная прога–то валится?
Или я чего–то принципиального не понимаю?

Спасибо.

Офлайн

#6 Дек. 4, 2019 11:42:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 6597
Репутация: +  586  -
Профиль   Отправить e-mail  

Не пойму про try / except

modsley
По идее–то, из try я что–то запустил.
Это что–то в свою очередь может ещё десяток модулей использовать.
Исключение распространяется выше (propagation) и отловится на любом уровне выше, если там есть отлов исключения.

Если же программа до этой части кода, где отлов исключения есть, не дошла, либо уже вышла из него, то порождённое исключение пойдёт выше и выйдет в интерпретаторе, если его никто выше не отловит.

Поэтому тут вывод такой: ты не туда смотришь; исключение происходит не там, где ты думаешь; а в реальном месте никакого отлова исключения нет.



Отредактировано py.user.next (Дек. 4, 2019 11:43:02)

Офлайн

#7 Дек. 4, 2019 20:17:08

modsley
Зарегистрирован: 2019-12-03
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не пойму про try / except

Спасибо всем за терпение к моей тупости.

Собственно, проблема была в том, что было так….

 class MainWindow():
	....
	def func(self):
		try:
			return 1/0
		except:
			print('error')
	def func(self):
		return 1/0
MainWindow.func()

Как говорится, и смех, и грех. Прошу прощения.

Отредактировано modsley (Дек. 4, 2019 20:42:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version