2015-01-23 3 views
1

У меня есть функция, которая возвращает обработчик соединения DB из MongoDB. У меня есть другие функции, которые делают вызов в БД, я полагаю, что давайте переместим обработчик подключений в функцию, поэтому мне не нужно определять его в каждой функции.Как правильно использовать try/except в Python

Правильно ли это выглядит? Я думаю, мой вопрос заключается в том, что если он не может подключиться к серверу БД, он будет печатать оба сообщения Could not connect to server и No hosts found Как я могу только распечатать «Не удалось подключиться к серверу».

def mongodb_conn(): 
    try: 
     conn = pymongo.MongoClient() 
    except pymongo.errors.ConnectionFailure, e: 
     print "Could not connect to server: %s" % e 
    return conn 

def get_hosts() 
    try: 
     conn = mongodb_conn() 
     mongodb = conn.dbname.collection 

     b = [] 
     hosts_obj = mongodb.find({'_id': 'PR'}) 
     for x in hosts_obj: 
      print x 
    except: 
     print "No hosts found" 

get_hosts() 
+0

В 'mongodb_conn' может быть ошибка: в случае возникновения исключения conn будет _never_ быть определен! – ForceBru

+0

возможно 'за исключением: pass' –

+0

@pss arrghh, пожалуйста, не рекомендуется, что это абсолютно ужасно. –

ответ

6

Перемещайте conn = mongodb_conn() вызов из от try .. except обработчика, и испытание, если None был возвращен:

def get_hosts() 
    conn = mongodb_conn() 
    if conn is None: 
     # no connection, exit early 
     return 

    try: 
     mongodb = conn.dbname.collection 

     b = [] 
     hosts_obj = mongodb.find({'_id': 'PR'}) 
     for x in hosts_obj: 
      print x 
    except: 
     print "No hosts found" 

Вы должны любой ценой избегать использования одеяло except однако; вы ловли все сейчас, в том числе ошибки памяти и прерываний клавиатуры, см Why is "except: pass" a bad programming practice?

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

except (AttributeError, pymongo.errors.OperationFailure): 

или вы можете использовать несколько except заявления обрабатывать различные исключения по-разному.

Ограничить обработчик исключений только теми частями кода, в которых может быть выбрано исключение. Например, цикл for x in hosts_obj:, вероятно, не собирается генерировать исключение AttributeError, поэтому он, вероятно, не должен быть частью блока try.

Обратите внимание, что вам необходимо настроить функцию mongodb_conn(), чтобы не попробовать и использовать локальный conn, если он никогда не был установлен; вы получите UnboundLocal ошибку, если вы:

def mongodb_conn(): 
    try: 
     return pymongo.MongoClient() 
    except pymongo.errors.ConnectionFailure, e: 
     print "Could not connect to server: %s" % e 

Теперь функция возвращает соединение в случае успеха, None если соединение не удалось.

+0

не вызовет ли он ошибку подключения? –

+0

@PadraicCunningham: * what * будет вызывать ошибку подключения? –

+0

ничего не понял, что вы изменили код, но вы теперь поймаете все исключения вместо того, что было в исходном коде OP нет? –

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