Я хочу сделать:
try:
do()
except:
do2()
except:
do3()
except:
do4()
Если do() не работает, выполните do2(), если do2() тоже сбой, запустите do3() и т.д.
С наилучшими пожеланиями
Я хочу сделать:
try:
do()
except:
do2()
except:
do3()
except:
do4()
Если do() не работает, выполните do2(), если do2() тоже сбой, запустите do3() и т.д.
С наилучшими пожеланиями
Я написал быструю функцию обертки first()
для этого.
использование: value = first([f1, f2, f3, ..., fn], default='All failed')
#!/usr/bin/env
def first(flist, default=None):
""" Try each function in `flist` until one does not throw an exception, and
return the return value of that function. If all functions throw exceptions,
return `default`
Args:
flist - list of functions to try
default - value to return if all functions fail
Returns:
return value of first function that does not throw exception, or
`default` if all throw exceptions.
TODO: Also accept a list of (f, (exceptions)) tuples, where f is the
function as above and (exceptions) is a tuple of exceptions that f should
expect. This allows you to still re-raise unexpected exceptions.
"""
for f in flist:
try:
return f()
except:
continue
else:
return default
# Testing.
def f():
raise TypeError
def g():
raise IndexError
def h():
return 1
# We skip two exception-throwing functions and return value of the last.
assert first([f, g, h]) == 1
assert first([f, g, f], default='monty') == 'monty'
Если вы действительно не заботитесь об исключениях, вы можете выполнить цикл над случаями, пока не добьетесь успеха:
for fn in (do, do2, do3, do4):
try:
fn()
break
except:
continue
Это по крайней мере позволяет избежать отступов один раз для каждого случая. Если разные функции нуждаются в разных аргументах, вы можете использовать functools.partial, чтобы "перенести" их перед циклом.
Похоже, что это действительно странно, но я бы, вероятно, зациклился на функциях и разразился, когда не было поднято исключение:
for func in [do, do2, do3]:
try:
func()
except Exception:
pass
else:
break
Вы должны указать тип исключения, которое вы пытаетесь поймать каждый раз.
try:
do()
except TypeError: #for example first one - TypeError
do_2()
except KeyError: #for example second one - KeyError
do_3()
и т.д.
Вот самый простой способ, который я нашел, просто вставьте try в предыдущее, кроме.
try:
do()
except:
try:
do2()
except:
do3()
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise