2013-12-20 5 views
0

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

Если мы имеем следующий макет класса: (. Объект с некоторыми функциями, например, извлекать данные из почтового ящика)

  1. Основного класса (управляет пользовательским ввод)
  2. Рабочего класса
  3. Вспомогательного класс (Object с вспомогательными функциями)

Поскольку я использую обратные вызовы, когда я создаю объект Worker, я предоставляю ему обратный вызов, который затем стекает вниз в класс Helper. Поэтому, когда класс Helper генерирует известную ошибку, он перемещается «вверх» в основной класс, и эта ошибка сообщается пользователю.

+0

Вы используете асинхронную структуру, такую ​​как Twisted? – Jared

+0

Нет, это все код, который я написал. – user791953

+1

Есть ли причина не поднимать и ловить пользовательские исключения? – cmd

ответ

2

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

Так, только поднять исключения из нижнего кода уровня и поймать их на верхнем уровне - или более точно: поймать их, где вы можете справиться с ними, и добавить верхнего уровня кетчуп все обработчик необработанных исключений, регистрирует ошибку (встроенный модуль протоколирования является вашим другом), попробуйте восстановить, если это возможно, иначе отобразите удобное сообщение об ошибке и попытайтесь как можно более прекратить приложение.

import logging 
logger = logging.get_logger("myapp") 

def something_deeper(): 
    raise SomeException("yadda") 

def execute_some_code(*args) 
    do_something() 
    something_deeper() 
    this_wont_happen() 

def main(*args): 
    configure_logging() 
    try: 
     execute_some_code(*args) 
    except SomeRecovarableException as e: 
     warn_user(e) 
     try_to_recover_from(e) 
    except SomeUnrecovarableException as e: 
     logger.exception("oops, crashing") 
     try_to_exit_cleanly_if_possible() 
    finally: 
     do_some_cleanup()    

if __name__ = "__main__": 
    import sys 
    main(*sys.argv()) 
+0

Интересно, я изучу ваш пример и посмотрю, что можно сделать. – user791953

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