Использование try / catch, чтобы повторить тот же метод - PullRequest
2 голосов
/ 30 сентября 2010

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

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


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

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

Ответы [ 3 ]

3 голосов
/ 30 сентября 2010

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

1 голос
/ 30 сентября 2010

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

0 голосов
/ 30 сентября 2010

Похоже, вы говорите о чем-то вроде Заводской метод . Я бы создал отдельный класс Creator для обработки такой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...