2010-12-16 2 views
2

У меня обычно нелегко рушиться, как обращаться с исключениями urllib2. Поэтому я все еще учусь. Вот сценарий, на который мне хотелось бы посоветоваться.Обработка исключений с помощью urllib2 с couchdb

У меня есть база данных db локального дивана. Я хочу знать, существует ли база данных. т.е. "127.0.0.1:5984/database". Если он не существует, и я могу достичь «127.0.0.1:5984», я хочу знать, поэтому я могу создать новую базу данных.

Вот несколько случаев, я думаю о том:

1) я мог бы получить тайм-аут.

2) мой URL является неправильным в том смысле, что я не в состоянии достигнуть базы данных полностью т.е. я напечатал 127.0.4.1:5984/database но CouchDB на 127.0.0.1:5984

3) путь к базе данных " база данных "не существует на базе дивана.

Так вот некоторый код, я написал с ним обращаться:

Что я делаю, это проверить реакцию. Если все в порядке, я установил db_exists в True. Единственный раз, когда я устанавливал db_exists в False, я получаю 404. Все остальное просто выходит из программы.

request = urllib2.Request(address) 
try: 
    response = urllib2.urlopen(request) 
except urllib2.URLError, e: 
    if hasattr(e, 'reason'): 
     print 'Failed to reach database' 
     print 'Reason: ', e.reason 
     sys.exit() 
    elif hasattr(e, 'code'): 
     if e.code == 404: 
      db_exists = False 
     else: 
      print 'Failed to reach database' 
      print 'Reason: ' + str(e) 
      sys.exit() 
else: 
    try: 
        #I am expecting a json response. So make sure of it. 
     json.loads(response.read()) 
    except: 
     print 'Failed to reach database at "' + address + '"' 
     sys.exit() 
    else: 
     db_exists = True 

Я по схеме обработки исключений скомпонованной в URLlib2 The Missing Manual.

Так в основном мои вопросы ...

1) Является ли это чистый, надежный способ справиться с этим?

2) Обычная практика посыпать sys.exit() по всему коду.

-Update- Использование CouchDB-питон:

main(db_url): 
    database = couchdb.Database(url=db_url) 
    try: 
     database.info() 
    except couchdb.http.ResourceNotFound, err: 
     print '"' + db_url + '" ' + err.message[0] + ', ' + err.message[1] 
     return 
    except couchdb.http.Unauthorized, err: 
     print err.message[1] 
     return 
    except couchdb.http.ServerError, err: 
     print err.message 
     return 
    except socket.error, err: 
     print str(err) 
     return 

if __name__ == '__main__': 
    # note that id did not show it here, but db_url comes from an arg. 
    main(db_url) 

ответ

1

Я бы сказал, что вы атакуете эту проблему на слишком низком уровне. Почему бы не использовать couchdb-python?

Чтобы ответить на ваши вопросы, 1) нет, это не особенно чистый способ сделать это. Я бы, по крайней мере, поставил код в вашем исключающем блоке в метод, который извлекает типы ошибок, подходящие для вашего приложения, из urrlib2.URLError. Для 2), нет плохой практики, чтобы вызвать sys.exit() почти все время. Поднимите соответствующее исключение. По умолчанию это будет пузыриться и останавливать интерпретатор, как и ваш sys.exit(), но с трассировкой. Или, поскольку ваш клиент Couch является библиотекой, исключения могут обрабатываться по усмотрению приложения. Код библиотеки никогда не должен выходить из интерпретатора.

+0

Спасибо за совет. Я обновил сообщение с версией couchdb-python. Идея заключается в том, что попытка выполнена успешно, тогда база данных существует. Использует ли обработка исключений здесь больше смысла? – sbartell 2010-12-17 20:21:51

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