#python #try-catch
#python #попробуйте-catch
Вопрос:
все, мой код на python выглядит примерно так:
try:
foo1()
except FooError1:
try:
foo2()
except FooError2:
dosth()
raise raisesth()
Интересно, есть ли поддержка try-except для нескольких условий или составных условий в python, таким образом, мой код мог бы быть упрощен как:
try:
foo1()
foo2()
except FooError1 and FooError2:
dosth()
raise raisesth()
Спасибо!
Комментарии:
1. Нет, это невозможно. Они выполняются
foo2()
в разных условиях.
Ответ №1:
Я предлагаю вам прочитать документацию по python.
Я предполагаю, что вы хотите dosth
вызываться, если foo1()
или foo2()
возникает исключение, которое вы хотите обработать в dosth()
, например, во втором блоке кода.
try:
foo1()
foo2()
except (FooError1, FooError2):
dosth()
raise raisesth()
Поскольку вы можете задать and
условие в своем except
заявлении, я помню, что исключение должно обрабатываться сразу после его возникновения, иначе выполнение остановится, поэтому вы не можете сказать интерпретатору продолжать ждать, пока FooError2
придет…
Комментарии:
1. Это не имеет такого же поведения, как в первом примере.
2. @neurino: Это работает как или , не так ли? Он запрашивает и .
3. @Fenikso: понял, вы правы. Тогда я надеюсь, что OP объясняет, при каких именно условиях требуется
dosth
выполнение…4. Всем спасибо! После того, как я проверил документ python, я понял, что except может содержать кортеж из нескольких условий. Это работает как условие или .
5. @demoslam — да, но он не будет вести себя так же, как вы написали в своем первом примере.
Ответ №2:
Исключение и ;-).
def foo1():
return 1/0
def foo2():
return s
def do_something():
print("Yes!")
def exception_and(functions, exceptions, do_something):
try:
functions[0]()
except exceptions[0]:
if len(functions) == 1:
do_something()
else:
exception_and(functions[1:], exceptions[1:], do_something)
# ================================================================
exception_and([foo1, foo2], [ZeroDivisionError, NameError], do_something)
# Behaves the same as:
try:
foo1()
except ZeroDivisionError:
try:
foo2()
except NameError:
do_something()
Комментарии:
1. Может быть упрощен с помощью
zip()
иfor
/else
.