Использование исключений OpenStack Nova

Когда я использую nova.keypairs.create() и передаю ему недопустимый открытый ключ, я получаю следующее:

BadRequest: Keypair data is invalid: failed to generate fingerprint (HTTP 400) (Request-ID: req-12bc6440-f042-4687-9ee9-d89e7edc260d)

Я попытался сделать следующее, и по понятным причинам (это уникальное исключение для OpenStack) это не сработало:

try:
    nova.keypairs.create(name=keyname, public_key=key)
except BadRequest:
    raise cherrypy.HTTPError(400, "Invalid public key")

Как я могу использовать определенные исключения OpenStack, такие как BadRequest, в своих собственных операторах try и exclude?


person MRichards    schedule 07.12.2017    source источник


Ответы (1)


Вам нужно будет импортировать исключения для пакета nova. Просматривая github для поиска пакета, вы, похоже, нужно сделать:

from nova.exception import *

Обратите внимание, что на самом деле вы видите исключение InvalidKeypair. исключение, которое само является подклассом класса исключения Invalid, сообщение BadRequest — это просто текст шаблона для него.

Итак, ваш полный код будет выглядеть примерно так:

from nova.exception import *
# You can import specific ones if you are confident about them
try:
    nova.keypairs.create(name=keyname, public_key=key)
except InvalidKeypair:
    raise cherrypy.HTTPError(400, "Invalid public key")
person Anshul Goyal    schedule 07.12.2017
comment
Я не уверен, что это из-за того, что я использую Nova версии 2.1, но мне пришлось изменить за исключением InvalidKeypair на BadRequest (у меня было NameError, указывающее, что InvalidKeypair не определено. Кажется немного глупым, что теперь он получит каждый неверный запрос, а не только при возникновении ошибки, когда есть недопустимая пара ключей, но это может быть просто я использую старую версию. - person MRichards; 07.12.2017
comment
@MRichards Это очень возможно, я не был уверен, какую версию Nova вы используете, но концепция будет продолжаться в том же духе. В общем, хороший способ понять, какое исключение выбрасывается (и из какого файла), состоит в том, чтобы поймать общее исключение и поместить оператор import traceback; print_traceback(), который сообщит вам весь путь выполнения до этого исключения. - person Anshul Goyal; 07.12.2017
comment
@MRichards Если это помогло, не забудьте принять и проголосовать :) - person Anshul Goyal; 07.12.2017