2015-01-09 1 views
0

Итак, я строю из куска инфраструктуры, которая занимается автоматически раскручивается экземпляров, настройка групп безопасности, и т.д ...Как запустить код, чтобы разрушить объект на ошибки в Python

Иногда, при прохождении процесса развития все ломается. Объект, который имеет дело со всем, выдает часть ошибки через процесс создания экземпляра или одну из бесчисленных других ошибок. Когда это случается, я в основном обременен большим количеством инфраструктуры, сидящей вокруг.

Проблема в том, что я не знаю заранее, когда/где ошибка будет выброшена. Мой вопрос заключается в том, есть ли способ запустить какой-то фрагмент кода разрыва в случае какой-либо ошибки? Например:

class Foo(object): 
    def __init__(self): 
     # set up ec2 instance 
     raise SomeError() 

    def __on_error__(self): 
     # tear down ec2 instances 

Другим ограничением является то, что некоторые из кода срыва могут, вероятно, ошибочно, что хорошо. Обычно это происходит, когда я пытаюсь снести то, что на самом деле не получилось. В идеале что-либо в функции __on_error__ будет терпеть неудачу, но, не дожидаясь обертывания всего в цикле try/except:pass, я не уверен, как это достичь.

ответ

2

Это выглядит немного как вы делаете какое-то управление ресурсами - В этом случае менеджер контекста очень приятно:

class Foo(object): 
    ... 
    def __enter__(self): 
    return self 

    def __exit__(self, exc_type, exc_value,tb): 
    if exc_type is not None: 
     # exception occurred, do some exception handling specific cleanup. 
     self.__on_error__() 

Теперь вы можете использовать его в качестве менеджера контекста:

with Foo() as foo: 
    ... 

И когда вы дойдете до конца этого набора команд, будет запущен метод __exit__.

Обратите внимание, что это не поможет вам, если исключение выбрано в Foo.__init__, поскольку контекст не вводится до тех пор, пока не возвращается Foo.__enter__.

+0

Будет ли контекст немедленно запускаться, если возникает ошибка при вводе? –

+0

@SlaterTyranus - № Контекст вводится _after_ '__enter__' возвращает. – mgilson

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