2014-12-04 2 views
0

У меня есть класс, который выполняет некоторые проверки здравомыслия внутри __init__. Если некоторые из них не работают, я хочу прекратить обработку __init__.Как «завершать» внутри init

Пример:

class MyClass(object): 
    def __init__(self, hostname, conn=None, user=None, passwd=None): 
     # SNIP (code to check if connection was supplied, if not user/pass) 
     if not conn.is_logged_in(): 
      if not conn.Login(): 
       raise LoginFailed("Failed to login to '%s'" % hostname) 
       return 
     # some code that relies on valid connection 

Если я хочу прекратить обработку после первой проверки вменяемости, как это может быть сделано? Фактический код, который я пишу, устанавливает соединение с службой REST, поэтому моя первая проверка работоспособности - это проверить предоставленное соединение или, если вы указали вместо этого имя пользователя и пароль, установите соединение в __init__().

Очевидно, что если соединение не выполняется, я не хочу выполнять последующие задачи, которые полагаются на соединение. По сути, я хочу, чтобы создание объекта потерпело неудачу.

Любые предложения? Благодарю.

+6

Что случилось с поднятием исключения? – dm03514

+0

Вы имеете в виду что-то конкретное от «terminate»? Вы уже создаете исключение, если не можете войти в систему; какое другое поведение вы ищете помимо этого? –

+1

Я с @ dm03514. Похоже, это именно то, для чего нужны исключения. –

ответ

0

Вы можете использовать sys.exit(), хотя это делает то, что уже делает ваш код.

Вы также можете использовать return из метода init, чтобы остановить обработку, и это не приведет к фатальной ошибке, но остановит метод.

+0

Я попытался вернуться, но он не работает. Если моя первая проверка на работоспособность завершилась неудачно, она продолжается, и я получаю все записи и ошибки дальше в init. – BenH

+0

@BenH Можете ли вы опубликовать код с возвращением в вопрос? – HarryCBurn

+0

Хорошо, обновил код, чтобы показать, как я пытался использовать return. – BenH

1

На C++ мы используем while break. В python, который был бы:

def __init__(self): 
    while True: 
     # Note that all the relevant code goes here. Inside the while 
     if not conn.is_logged_in(): 
      if not conn.Login(): 
       # raise LoginFailed("Failed to login to '%s'" % hostname) 
       break