Я использую Click для создания Python CLI и столкнулся с проблемой обработки исключений в Click.
Я не уверен в формулировке («подкоманда», «родительская команда») здесь, но из моего примера вы поймете, как я надеюсь. Предположим, что этот код:
@click.group()
@click.option("--something")
def mycli(something):
try:
#do something with "something" and set ctx
ctx.obj = {}
ctx.obj["somevar"] = some_result
except:
print("Something went wrong")
raise
#only if everything went fine call mycommand
@click.group()
@click.pass_context
def mygroup(ctx):
pass
@mygroup.command(name="mycommand")
@click.pass_context
def mycommand(ctx):
#this only works if somevar is set in ctx so don't call this if setting went wrong in mycli
Когда приложение запускается, это вызывается:
if __name__ == "__main__":
mycli.add_command(mygroup)
mycli()
Затем я запускаю программу следующим образом:
python myapp --something somevalue mycommand
Ожидаемое поведение: сначала вызывается mycli
и выполняется код в нем. Если возникает исключение, оно перехватывается блоком исключения, печатается сообщение и возникает исключение. Поскольку у нас нет другого блока try/except, это приведет к завершению скрипта. «Подкоманда» mycommand
никогда не вызывается, потому что программа уже завершилась при выполнении «родительской» команды mycli
.
Фактическое поведение: исключение перехватывается и сообщение печатается, но mycommand
все еще вызывается. Затем происходит сбой с другим сообщением об исключении, потому что требуемая переменная контекста не была установлена.
Как бы я справился с чем-то подобным? По сути, я хочу вызвать подкоманду mycommand
только для выполнения, если все в mycli
прошло нормально.