如何在python中在一个块中编写多个try语句?

如何在python中在一个块中编写多个try语句?,python,exception,exception-handling,Python,Exception,Exception Handling,我想做: try: do() except: do2() except: do3() except: do4() 如果do()失败,则执行do2(),如果do2()也失败,则执行exceute do3(),依此类推 致意您应该指定每次尝试捕获的异常的类型 try: do() except TypeError: #for example first one - TypeError do_2() except KeyError: #for examp

我想做:

try:
    do()
except:
    do2()
except:
    do3()
except:
    do4()
如果do()失败,则执行do2(),如果do2()也失败,则执行exceute do3(),依此类推


致意

您应该指定每次尝试捕获的异常的类型

try:
    do()
except TypeError: #for example first one - TypeError
    do_2()
except KeyError: #for example second one - KeyError
    do_3()

等等。

如果您真的不关心异常,您可以循环案例,直到成功:

for fn in (do, do2, do3, do4):
    try:
        fn()
        break
    except:
        continue

这样至少可以避免每次缩进一次。如果不同的函数需要不同的参数,您可以使用functools.partial在循环之前对其进行“prime”操作。

这似乎是一件非常奇怪的事情,但我可能会循环函数,并在没有引发异常时中断:

for func in [do, do2, do3]:
    try:
        func()
    except Exception:
        pass
    else:
        break 

我将为此编写一个快速包装函数
first()

用法
value=first([f1,f2,f3,…,fn],默认值='All failed')


这是我找到的最简单的方法,只需将try嵌入到前面的

try:
    do()
except:
    try:
        do2()
    except:
        do3()

如果我不知道异常的类型?@alwbic:如果你不知道异常的类型,你就不知道如何处理异常。@alwbic我确信你必须知道你期望的异常类型。我不同意你的看法。我知道我的陈述会失败,但我不知道他们失败的顺序。但我知道如果失败了该怎么办。@alwbic:这只是一种糟糕的做法“如果某件事失败了就做点什么”,你现在不知道它失败的原因。我感觉描述你的特定用例会得到一个更优雅的解决方案……
pass
应该是
continue
也许?工作原理与编写的一样,但是
continue
在语义上更清晰。@Triptych True,这会更好地表示意图。编辑答案。这根本不能回答问题!创造,但这里还有什么用?这里似乎是多余的。
else
只有在没有异常的情况下才会执行。如果出现异常,则将继续执行,而如果没有异常,
中断将执行。:)Python中的许多语句都采用
else
,目的是“如果一切顺利,那么就这样做”。请参阅
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