2015-04-25 2 views
2

Я создал редактор карт в Python2.7.9 для небольшого проекта, и я ищу способы сохранить данные, которые я редактирую, в случае какого-либо необработанного исключения. Мой редактор уже есть метод для сохранения из данных, и мое текущее решение, чтобы иметь основной цикл, завернутое в try..finally блок, аналогичный этому примеру:Можно ли обернуть весь основной цикл в блок try..finally?

import os, datetime #..and others. 
if __name__ == '__main__': 
    DataMgr = DataManager() # initializes the editor. 
    save_note = None 
    try: 
     MainLoop() # unsurprisingly, this calls the main loop. 
    except Exception as e: # I am of the impression this will catch every type of exception. 
     save_note = "Exception dump: %s : %s." % (type(e).__name__, e) # A memo appended to the comments in the save file. 
    finally: 
     exception_fp = DataMgr.cwd + "dump_%s.kmap" % str(datetime.datetime.now()) 
     DataMgr.saveFile(exception_fp, memo = save_note) # saves out to a dump file using a familiar method with a note outlining what happened. 

Это кажется, что лучший способ, чтобы убедиться, что, независимо от того, что происходит, делается попытка сохранить текущее состояние редактора (в той степени, в которой это предусмотрено saveFile()) в случае его сбоя. Но я задаюсь вопросом, действительно ли инкапсуляция моей основной петли в блок try является безопасной и эффективной и хорошей формой. Это? Существуют ли риски или проблемы? Есть ли лучший или более обычный способ?

+0

В идеале вы должны тщательно протестировать свой код и исправить любые сбои, а затем вам не понадобится 'try' вокруг вашего кода. Однако, поскольку полное тестирование иногда нереально, это может быть достойная мера «на всякий случай», если она не станет ленивым парашютом (например, «ну, я думаю, эта функция иногда может терпеть неудачу, try' поймает его, поэтому я исправлю его в следующем выпуске, возможно »). – TigerhawkT3

+0

@ TigerhawkT3 Это в значительной степени мое отношение к этому, но ввиду того, что я все еще очень плохо разбираюсь в этом, я просто ищу способ сохранить свое время и усилия между сглаживанием маленьких морщин жизни, так сказать. Я прошу в основном убедиться, что блоки 'try..finally' или' try..except..finally' не имеют никакого особого поведения (читай: вредные или замедляющие эффекты), которые появляются, если вы слишком долго не заканчивая их. – Augusta

ответ

1

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

Альтернативно, взгляните на atexit python module. Это позволяет вам регистрировать функцию (функции) для автоматической функции обратного вызова при выходе из программы.

Говорят, что вы должны работать достаточно хорошо.

+0

'atexit' кажется действительно полезным для такого рода ситуации. Я посмотрю на это подробнее. Это также полезно для не-аварийных условий. – Augusta

+0

Я использовал его для обработки ошибок и управления потоком. На самом деле это довольно умный модуль! –

1

Обтекание основной петли в блоке try...finally является принятым образцом, когда вам нужно что-то произойти независимо от того, что. В некоторых случаях он регистрируется и продолжается, в других - это спасение всего возможного и выход из него.

Итак, вы - код в порядке.

Смежные вопросы