Обработка исключений urllib2 с помощью couchdb - PullRequest
2 голосов
/ 16 декабря 2010

Мне обычно трудно понять, как обрабатывать исключения urllib2. Так что я все еще учусь. Вот сценарий, по которому я хотел бы получить несколько советов.

У меня есть локальная база данных couch 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) путь к базе данных "database" не существует в базе данных couch.

Итак, вот код, который я написал, чтобы справиться с этим:

Что я делаю, так это проверяю ответ. Если все хорошо, я устанавливаю 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-python:

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 Ответ

1 голос
/ 17 декабря 2010

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

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

...