python - 在 python 中编写 "try elsetry"的最佳方法?

标签 python try-catch

我知道“tryelse”不是真实的东西,但我的问题是关于写出此逻辑的最佳方式。在以下示例中,foo 和 bar 是可能会中断的函数。

我希望 aa 成为 foo(),但如果它中断,我希望它成为 bar(),但如果那一个也中断,然后将 aa 设置为默认值 0。

try:
    aa = foo()
elsetry:
    aa = bar()
except e:
    aa = 0

重申我的问题,用 Python 编写此逻辑的最佳实际方法是什么?

最佳答案

如果您有一长串这些,或者有一个动态备选方案列表,您可能想要使用for 循环:

for func in funcs:
    try:
        aa = func()
        break
    except:
        pass
else:
    aa = 0

请注意,无论哪种方式,您可能都不真的想要一个空的except。通常你只期待一些特定类别的错误(例如,ValueErrorLookupError),其他任何事情都不应该意味着“默默地尝试下一个”,而是“显示出乎意料的错误的程序员”。但您知道如何解决这个问题。


如果您需要重复使用它,您当然可以将其包装在一个函数中:

def try_funcs(*funcs, defval=0, ok_exceptions=Exception):
    for func in funcs:
        try:
            return func()
        except ok_exceptions:  # ok_exceptions can also be a tuple of exception classes.
            pass
    return defval

当然,如评论中所述,这确实要求您要尝试的所有内容都是无参数的函数。如果你想尝试 spam(42),如果失败则尝试 eggs(beans) 怎么办?或者甚至不是函数调用而是一些其他表达式的东西,比如 foo[bar]

这与 Python 中出现的一般情况相同:您使用 partial 绑定(bind)第一种情况的参数,或者使用 lambda 编写包装函数第二个:

result = try_funcs(partial(spam, 42), partial(eggs, beans), lambda: foo[bar])

但是,如果您只有两个或三个静态替代方案可以尝试,Simon Visser's simple nested answer清晰多了。


如果您问为什么该语言没有您的tryelse……好吧,我知道它出现在 python-ideas/-dev 列表和其他地方几次,并被讨论过,所以你可能想搜索更详细/权威的答案。但我认为这归结为:虽然理论上可以提出使用 tryelse 看起来更干净的案例,但任何人给出的每个示例要么按原样好,要么显然应该重构, 因此没有令人信服的理由来改变语法、保留新关键字等。

关于python - 在 python 中编写 "try elsetry"的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27325666/

相关文章:

Python 使用正则表达式匹配复杂字符串

python - 属性错误: 'datetime.time' object has no attribute 'time'

python - 如何创建石头剪刀布程序

powershell - 尝试 Catch 在 Powershell 脚本中不起作用

javascript - 使用Async/Await正确尝试…捕获语法

swift - 使用错误枚举的关联值和计算属性

python - mysql sqlalchemy 关键字搜索

python - Flask-sqlalchemy:无法将属性字段作为关键字参数提供给构造函数

language-agnostic - 跳出 "try-catch"?

ruby catch 和效率