Уведомления

Группа в Telegram: @pythonsu

#1 Июль 28, 2017 17:15:01

unza
Зарегистрирован: 2017-07-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

заработало, если кому надо, код:

 def load(site):
    req = urllib.request.Request(site, headers={'User-Agent': 'Firefox'})
    with urllib.request.urlopen(req) as data:
        charset = data.headers.get_charsets()[0]
        text = data.read().decode(charset or 'latin1')
        #print (text)
    return text
 
def get_site(site, timeout):
    text = None
    while True:
        try:
            text = load(site)
            break
        except TimeoutError:
            print ("Error network")
            time.sleep(timeout)
    return text

Но, если сеть обрывается, небольшое зависание, и вываливает лог ошибки с резюме:
urllib.error.URLError: <urlopen error EOF occurred in violation of protocol (_ssl.c:749)>

Интересно, как реализовывать что-бы программа не вываливалась?

Отредактировано unza (Июль 28, 2017 17:27:42)

Офлайн

#2 Июль 28, 2017 17:51:23

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

не интересно - перехватывать и обрабатывать нужный Exception



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Июль 28, 2017 18:44:24

unza
Зарегистрирован: 2017-07-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

через try - except заработало:

  
def load(site):
  hdr = {'User-Agent': 'Mozilla/5.0',
       'Accept': 'text/html',
       'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7',
       'Accept-Encoding': 'none',
       'Accept-Language': 'en-US,en;q=0.8',
       'Connection': 'keep-alive'}
  try:
    req = urllib.request.Request(site, headers=hdr)
    data = urllib.request.urlopen(req)
    charset = data.headers.get_charsets()[0]
    text = data.read().decode(charset or 'latin1')
  except:
    print ('Error network')
    text = None
  return text
def get_site(site, timeout):
    text = None
    while True:
        text = load(site)
        if (text != None): 
            #print (text)
            break
        else:
            print ('waite please!')
            time.sleep(timeout)
    return text

Но интересно было сделать через with as
Конкретную ошибку мне не надо обрабатывать, мне ждать появления страницы надо было.

Отредактировано unza (Июль 28, 2017 18:54:51)

Офлайн

#4 Июль 28, 2017 20:22:45

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

а как связаны в данном случае try except и with as?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Июль 28, 2017 21:26:35

unza
Зарегистрирован: 2017-07-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Исключения в urllib. TimeoutError: [WinError 10060]

Если честно, увидел пример, и подумал, что можно как-то использовать эти операторы в моем случае. Ведь функция load(url) на примере из 6го поста не должна по идее вызывать останов программы, а всего лишь как-то передавать ошибку в вызывающую ее функцию load_with_time(url, timeout), где она будет обработана исключением. Но скорее всего ошибся с этим предположением((

Офлайн

#6 Июль 29, 2017 00:21:52

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

Исключения в urllib. TimeoutError: [WinError 10060]

unza
через try - except заработало:
Не надо в load() ничего менять, если там выпало исключение, то оно станет распространяться и выйдет из load() наружу, и вот там его и надо перехватывать (рядом с таймаутом).



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version