Правильный способ обработки исключений на Python2.6 - PullRequest
0 голосов
/ 23 мая 2018

У меня был скрипт Python, который работал непрерывно.Если в каталоге есть какой-либо новый файл, то питон откроет URL с помощью urllib2, чтобы выполнить какой-либо запрос на конкретном IP.

Вот код

encoded_string = base64.b64encode(image_file.read())
values = dumps({
    'image_data':encoded_string,
    'requestCode':'111'
})

headers = {"Content-Type": "application/json"}
request = Request("http:/xx.xxx.xx.xxx/api/carplate_service",data=values, headers=headers)
response = urlopen(request, timeout=60)

Код работает хорошо, но наугадвремя, скажем, обычно происходило в 1-2 часа ночи, затем я получил эту ошибку:

<class 'urllib2.URLError'> - <urlopen error [Errno 110] Connection timed out>

У меня было исключение для этой функции на этом рисунке:

try:
    ip = sys.argv[1]
    histId = int(sys.argv[2])
    handler = ModHandler()
    wm = pyinotify.WatchManager()
    notifier = pyinotify.Notifier(wm, handler)
    wdd = wm.add_watch('./' + ip + '/', pyinotify.IN_CLOSE_WRITE)
    notifier.loop()
except BaseException as e:
    with open("error.log", "a") as text_file:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        text_file.write( time.strftime("%Y-%m-%d %H:%M:%S") + " [" + str(exc_tb.tb_lineno) + " - " + fname + "] : " + str(exc_type) + " - " +  str(e) + "\n")
        text_file.close();

Исключение не работаетхорошо, потому что приложение не может продолжаться, если есть какая-то ошибка, как указано выше.

Мой вопрос заключается в том, как заставить программу продолжать работу даже при генерации исключения?

Я использую python2.6

Спасибо

1 Ответ

0 голосов
/ 23 мая 2018

Для вызовов функций, которые отправляются во внешние службы, я обычно нахожу, что следующая базовая структура работает очень хорошо

import time

expire_time = 2

while True:
    start_time = time.time()
    try:
        # Do something here
        # ....
        # If you make it to the bottom of the code, break out of the loop
        break
    except BaseException as e:
        # Compare the start_time with the current time
        now_time = time.time()
        if now_time > start_time + expire_time:
            raise e

        # Otherwise try executing the `try` block again

Используя предоставленный вами код, он может выглядеть примерно так

import time

expire_time = 2

while True:
    start_time = time.time()
    try:
        ip = sys.argv[1]
        histId = int(sys.argv[2])
        handler = ModHandler()
        wm = pyinotify.WatchManager()
        notifier = pyinotify.Notifier(wm, handler)
        wdd = wm.add_watch('./' + ip + '/', pyinotify.IN_CLOSE_WRITE)
        notifier.loop()
        break
    except BaseException as e:
        now_time = time.time()
        if now_time > start_time + expire_time:
            raise e
        else:
            with open("error.log", "a") as text_file:
                exc_type, exc_obj, exc_tb = sys.exc_info()
                fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
                text_file.write( time.strftime("%Y-%m-%d %H:%M:%S") + " [" + str(exc_tb.tb_lineno) + " - " + fname + "] : " + str(exc_type) + " - " +  str(e) + "\n")
                text_file.close();
...