2015-09-26 2 views
2

Это очень простой вопрос дизайна. Моя программа должна выйти, если некоторые условия не выполняются. У меня есть class A. Указанный ниже способ main_logic содержит инструкции по управлению. Этот метод создает несколько экземпляров и вызывает некоторые методы, определенные на них. Я показываю один такой пример, где он создает объект b = CalcB(), а затем вызывает b.run().python Рекомендуемый способ выхода из программы

В то время как в b.run(), я ухожу из кода в update_val. main_logic отвечает за вызов другого кода.

Мои вопросы:

  1. Это приемлемая практика для выхода из программы из некоторого опорного кода (в данном случае update_val из CalcB Или я должен всегда возвращать код ошибки и сделать это внутри main_logic? ?
  2. есть ли лучший дизайн справиться с такой ситуацией? Пример некоторого класса обработки ошибок? любая иллюстрацией элегантного решения будет оценено

    import sys 
    class Shelf: 
        def get_factor(self): 
         self.some_factor = 0.5 
         return self.some_factor 
    
    class CalcB: 
        def __init__(self): 
         self.shelf = Shelf() 
         self.ref = 1.0 
         self.area = 3.14285 
    
        def run(self): 
         print("Calculation B running") 
         some_factor = self.shelf.get_factor() 
         self.update_val(some_factor) 
    
        def update_val(self, some_factor): 
         self.value = some_factor*self.area 
         if (self.value > self.ref): 
          print("too bad.. exiting the program") 
          sys.exit() 
    
    class A: 
        def main_logic(self): 
         b = CalcB() 
         b.run() 
         # some more code follows... 
         #do_something() 
         #d = CalcD() 
         #do_something_else(d)      
    
    if __name__ == "__main__": 
        a = A() 
        a.main_logic() 
    

ответ

1

Для того чтобы код мог быть повторно использован, он не должен вызывать поведение вызывающего кода. Стандартное решение состоит в том, чтобы поднять исключение и вывести основную программу на это исключение.

class ClassAException(Exception): 
    pass 

class ClassA (object): 
    def method: 
     if situation not in stuff_I_can_handle: 
      raise ClassAException('Cannot handle ' +repr(situation)) 

Я не уверен относительно вашего второго вопроса. Ситуация, в которой вы знаете, как обращаться, вероятно, должна быть обработана там и тогда. Исключения для ситуаций, которые вы не готовы обрабатывать.

+0

спасибо @tripleee и Antti. Итак, предложите ли вы создать собственный класс исключений? Кроме того, вы могли бы ответить на вторую часть вопроса ... то есть, должен ли я иметь некоторый общий класс для наблюдения за такими проблемами и возникновения исключения? – stackjs

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