2010-09-30 3 views
2

У меня есть класс, методы которого требуют, чтобы определенное поле класса было правильно. Это поле класса задается в конструкторе, и оно считывается из файла конфигурации, и оно может или не может получить правильные данные из этого файла конфигурации. Если данные неверны, они будут иметь неправильные данные в поле класса, а метод класса выдаст исключение.Использование try/catch для повторения одного и того же метода

Если это произойдет, то, что я хочу сделать, это снова запустить метод, но с другим вызовом конструктора класса. Это то, что разумно обрабатывается в попытке: поймать? Потому что метод МОЖЕТ бросить то же исключение даже с правильным полем класса. Так что я хочу, чтобы в первый раз вызывается метод, исключение поймано, а затем метод запускается снова. Но во втором случае, если исключение выбрано, я хочу, чтобы оно распространялось. Итак:


try: 
    MyClass().method() 
except MyException: 
    MyClass(True).method() 

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

+0

Из того, что вы описали, это выглядит правильно. –

+2

Почему бы вам просто не написать правильный «конструктор» (это фактически инициализатор), который исправляет неверные данные? Это такие виды, как «зачем устанавливать тормоза, когда есть ручной тормоз?» –

+0

Поскольку данные на самом деле являются аппаратным адресом, и единственный способ протестировать его - попытаться поговорить с устройством и дождаться его отказа, что может (действительно) заняться до 4 секунд, даже если оно не сработает. Это просто невозможно (или эффективно) проверить, что адрес ВЕРНО не только в правильном формате, но и в правильном адресе. Это намного эффективнее, просто ждать, когда метод будет терпеть неудачу при разговоре с ним, а затем повторить адрес. – Falmarri

ответ

3

Я немного удивлен тем, что вы не хотите, чтобы экземпляр MyClass придерживался для дальнейшего использования, но, учитывая, что это ваше намерение, ваш код правильный и краткий - он делает то, что вы заявляете, что хотите без какого-либо «очевидного недостатка». Я не уверен, какие объекты вы считаете уродливыми и какие из них вы считаете хорошенькими, но не вводя какие-либо «вспомогательные объекты», я не могу даже думать о другом способе достижения ваших заявленных требований! -)

+0

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

+0

@Falmarri, если метод статичен, вы не используете необходимо создать экземпляр класса, чтобы его вызвать - вот в чем весь смысл метода _static_ (в любом из Python, C++, Java, ...). –

+0

Да, это был просто пример непитонического материала, который у нас есть -P – Falmarri

1

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

0

Звучит так, re говоря о виде Factory method. Я бы создал отдельный класс Creator для обработки такой ситуации.