Как исключить TimeOutError во время запроса WMS? - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужен твой совет.Я устанавливаю соединение с WMS (Web Map Service).Если соединение установлено, WMS добавляется для рисования в окне matplot.В большинстве случаев изображение из WMS отображается правильно.Однако бывают случаи, когда изображение из WMS загружается слишком долго, что приводит к ошибкам (которые я прикрепил ниже).Обычно это ошибка TimeOut.

Я хотел бы привести мой код в форму, в которой в момент превышения времени TimeOut изображение из WMS перестает загружаться.Я хочу избежать повторного запроса изображения.

Для этой цели я бы хотел, кроме TimeError.К сожалению, я не могу.Конечно, я пробовал метод

, за исключением:

(без указания ошибок), но он не работает.Приведенный ниже код также не работает.

try:
    resp = requests.get('http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer')
    odpowiedz_wms = resp.status_code except:
    resp.status_code = 0 if resp.status_code == 200:
    wms = ax.add_wms(wms='http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer', layers=['Raster'])
    try:
        plt.draw()
    except (requests.exceptions.RequestException,socket.timeout,timeout, exceptions.ConnectionError,ReadTimeout, TimeoutError, exceptions.Timeout,exceptions.ReadTimeoutError,ReadTimeoutError,exceptions.ConnectTimeout, exceptions.ReadTimeout, requests.exceptions.ReadTimeout, urllib3.exceptions.ReadTimeoutError, socket.timeout) as e:
        wms.remove()
        plt.draw()

Исключение при обратном вызове Tkinter (последний вызов последним): (...)

Файл "C:\ Python35 \ lib \ socket.py ", строка 575, в readinto возвращает self._sock.recv_into (b) socket.timeout: timed out

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): (...) Файл "C: \ Python35 \ lib \ site-packages \ urllib3 \ connectionpool.py", строка 306, в _raise_timeout поднять ReadTimeoutError (self, url, "Read)Тайм-аут. (чтение тайм-аута =% s) "% timeout_value) urllib3.exceptions.ReadTimeoutError: HTTPConnectionPool (host = 'mapy.geoportal.gov.pl', port = 80): чтение тайм-аута.(read timeout = 30)

Во время обработки вышеупомянутого исключения произошло другое исключение:

Traceback (последний вызов был последним): (...) r = adapter.send (запрос,** kwargs) Файл "C: \ Python35 \ lib \ site-packages \ запросы \ adapters.py", строка 526, в запросе на повышение. ReadTimeout (e, request = request) запросы..geoportal.gov.pl ', порт = 80): тайм-аут чтения.(время ожидания = 30)

1 Ответ

0 голосов
/ 05 февраля 2019

Когда в фрагмент кода выдается исключение

  • Стек будет разматываться до тех пор, пока не достигнет обработчика исключений (попытаться - кроме блока)
  • Если во время вызова возникнет другое исключениеобработка исключения (в блоке кода кроме).Затем стек будет разматываться дальше до следующего обработчика исключений, способного перехватить исключение.Исключение, которое теперь необходимо обработать, не является исходным исключением.Теперь это последнее возникшее исключение
  • Если стек вызовов разворачивается до такой степени, что нет никаких обработчиков исключений дальше по стеку вызовов, тогда процесс завершится, и трассировка стека будет выведена на ваш экран, показывая всеошибки
  • Многие библиотеки содержат регистраторы, которые распечатывают трассировку стека во время обработки исключения.В этих случаях вы все равно получите трассировку стека на ваш экран.Но исключение не обязательно прекратит процесс.Это может быть обработано.
  • Хорошей практикой является реализация регистрации в ваших обработчиках исключений, чтобы вы знали, какие исключения происходят, и чтобы вы могли отладить, если что-то пойдет не так
  • В этом случае текущее исключение, которое ваш код будетприходится обрабатывать не первое исключение.Это ReadTimeout, который должен быть обработан.Хотя использование кроме без аргументов - верный способ поймать все, что подходит. Этот метод обработки исключений должен использоваться с осторожностью и только в качестве крайней меры.Часто будут обнаруживаться исключения, являющиеся подлинными ошибками, которые вы никогда не собирались ловить.Всегда пытайтесь указать тип исключения, которое вы на самом деле намереваетесь отловить

Пример

try:
    try:
        1/0
    except ZeroDivisionError:
        # Catches the ZeroDivisionError
        raise IndexError
except IndexError:
    # Catches the IndexError - Doesn't need to catch the ZeroDivisionError
    raise NameError # raises unhandled exception. Process terminated and entire stack trace will be printed

Выход

Traceback (most recent call last):
   File "pyex.py", line 14, in <module>
     1/0
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "pyex.py", line 17, in <module>
    raise IndexError
IndexError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "pyex.py", line 21, in <module>
    raise NameError # raises unhandled exception. Entire stack trace 
will be printed out
NameError
...