【问题标题】:Custom argumental TypeError messages自定义参数 TypeError 消息
【发布时间】:2016-08-21 13:46:21
【问题描述】:

我想根据TypeError 的具体原因返回一组自定义消息。

def f(x, y):
    value = x + y
    return "Success! ({})".format(value)

def safe(function, *args):
    try:
        result = function(*args)
    except TypeError:
        if "not_enough_args":  # What actual condition can go here?
            return "Not enough arguments."
        elif "too_many_args":  # What actual condition can go here?
            return "Too many arguments."
        else:
            return "A TypeError occurred!"
    else:
        return result

safe(f, 2)  # "Not enough arguments."
safe(f, 2, 2)  # "Success!"
safe(f, 2, 2, 2)  # "Too many arguments."
safe(f, '2', 2)  # "A TypeError occurred!"

最好使用实际的TypeError 对象。

【问题讨论】:

  • 只适用于有两个参数的函数还是任何函数?
  • @MoonCheesez 任何功能。

标签: python python-3.x exception response


【解决方案1】:

以下是您问题的可能解决方案:

def f(x, y):
    value = x + y
    return "Success! ({})".format(value)


def safe(function, *args):
    try:
        result = function(*args)
    except TypeError as e:
        return str(e)
    else:
        return result


def safe2(function, *args):
    try:
        result = function(*args)
    except TypeError as e:
        if "required positional argument" in str(e):
            return "Not enough arguments."
        elif "positional arguments but" in str(e):
            return "Too many arguments."
        else:
            return "A TypeError occurred!"
    else:
        return result

print(safe(f, 2))
print(safe(f, 2, 2))
print(safe(f, 2, 2, 2))
print(safe(f, '2', 2))
print('-' * 80)
print(safe2(f, 2))
print(safe2(f, 2, 2))
print(safe2(f, 2, 2, 2))
print(safe2(f, '2', 2))

如果您不需要确定引发了哪个 TypeError(安全),则返回异常就可以完成这项工作。如果不是(safe2),您可以以某种方式将异常解析为字符串。

如果您不想解析字符串并有自定义 TypeError 异常,那么您只需将 TypeError 子类化,因为 existing hierarchy 没有为您提供该类的专业化。

【讨论】:

  • 我需要确定哪个TypeError 已被提出 - 我想为每种情况生成自定义错误消息。如果可能的话,我也不太热衷于使用字符串解析,但它可能必须是我采取的路线。
  • @2Cubed 我已经编辑并完成了我的答案。无论如何,我已经为您提供了这个解决方案,这是最快、最简单的方法。
【解决方案2】:

我不会搞乱更改异常对象的性质,以及拥有一长串条件语句来打印出您自己的自定义消息。相反,只需返回异常对象。您可以在 except 行中执行此操作:

except TypeError as e

所以,现在您将拥有 eTypeError 异常对象。从那里开始,您可以随手做任何您想做的事情。

观察下面的例子。无论发生什么异常,您都会得到,并且不会修改其性质,而是按原样使用对象,并且可以打印出遇到的失败的确切消息。

def f(x, y):
    value = x + y
    return "Success! ({})".format(value)

def safe(function, *args):
    try:
        result = function(*args)
    except TypeError as e:
        return e
    else:
        return result

print(safe(f, 5, 6, 7))
# f() takes 2 positional arguments but 3 were given
print(safe(6))
# 'int' object is not callable

此外,您可以在safe 方法之外执行哪些操作,您可以简单地检查从safe 方法返回的类型并采取相应措施。

例子:

result = safe(5)
if type(result) is TypeError:
    print(result)

【讨论】:

  • 我不需要更改异常对象本身,但我确实需要生成自定义异常消息。我使用 Python 作为 UI 的后端,如果给定参数的数量与预期不匹配,我希望能够显示自定义错误消息。
  • 在异常中,使用e,您将可以访问该消息。检查e.args。即使您采用简单的字符串表示:str(e),您也会收到异常消息。从那里,您可以匹配创建自定义消息所需的任何内容。此外,您实际上可以创建一个自定义异常,例如从 TypeError 继承的 UnsafeCallException,并在其中设置您的逻辑来处理您需要的内容并显示适当的消息。
  • 我想使用实际异常对象中的值来生成自定义消息,而不是解析/匹配现有错误消息的特定部分。
  • 您是否检查过异常对象以了解您实际可用的内容,了解您尝试做的事情有多可行?发送dir(e) 看看有什么可供您使用,看看有什么接近您需要的。此外,如果您执行以下操作:e.__traceback__.tb_frame.f_locals,您将拥有可以使用的详细信息字典。最后,看看这个答案,它提供了一个很好的细分,你可以用异常做些什么:stackoverflow.com/a/1278740/1832539
  • e.__traceback__.tb_frame 似乎很有帮助。不幸的是,我似乎找不到实际的错误参数(例如,f() takes 2 positional arguments but 3 were given 中的23)。
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2018-10-20
  • 2017-08-30
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多