python - 单行异常处理

标签 python python-3.x exception exception-handling

在 Python 中,可以使用单行代码以简单、直观的方式设置具有特殊条件(例如默认值或条件)的值。

result = 0 or "Does not exist."  # "Does not exist."

result = "Found user!" if user in user_list else "User not found."

是否可以编写类似的捕获异常的语句?

from json import loads

result = loads('{"value": true}') or "Oh no, explosions occurred!"
# {'value': True}

result = loads(None) or "Oh no, explosions occurred!"
# "Oh no, explosions occurred!" is desired, but a TypeError is raised.

最佳答案

在 python 中不能做单行异常处理语句。可以编写一个函数来执行此操作。

def safe_execute(default, exception, function, *args):
    try:
        return function(*args)
    except exception:
        return default

示例用法:

from json import loads
safe_execute("Oh no, explosions occurred!", TypeError, loads, None)
# Returns "Oh no, explosions occurred!"
safe_execute("Huh?", TypeError, int, "10")
#Returns 10

支持多个参数

from operator import div
safe_execute(
    "Divsion by zero is invalid.",
    ZeroDivisionError,
    div, 1, 0
)
# Returns "Divsion by zero is invalid."

safe_execute(
    "Divsion by zero is invalid.",
    ZeroDivisionError,
    div, 1, 1
)
# Returns 1.

错误捕获过程仍有可能被中断:

from time import sleep
safe_execute(
    "Panic!",
    Exception,
    sleep, 8
)
# Ctrl-c will raise a KeyboardInterrupt

from sys import exit
safe_execute("Failed to exit!", Exception, exit)
# Exits the Python interpreter

如果不希望出现这种行为,请使用 BaseException:

from time import sleep
safe_execute("interrupted",
             BaseException,
             sleep, 8)
#Pressing Ctrl-c will return "interrupted"
from sys import exit
safe_execute("Naughty little program!",
             BaseException,
             exit)
#Returns "Naughty little program!"

关于python - 单行异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36671077/

相关文章:

python - 如何对 Django Select 小部件中的选择进行分组?

python - 类型错误 : can't use a string pattern on a bytes-like object

python - 有效地将特定行复制到另一个文件(Python 3.3)

python - 有没有办法在 plotly.py 中禁用悬停栏/模式栏?

java - 如果捕获到异常,则跳过 onClick 的其余部分

python - Python中使用优先级队列实现LRU缓存

python-3.x - 在 python3 上的 DataFrame 中标记假期

python - 包装对象的最简单方法是什么,以便包装器 __call__ 调用包装对象的 __getitem__ 方法

java - 当客户端发布的文件包含格式错误的数据时,Web 服务器应如何处理 http 请求?

c# - 在 C# 中,是否有任何我不应该使用的内置异常?