验证与异常对比错误消息元组

2 投票
2 回答
3003 浏览
提问于 2025-04-18 07:38

我正在做一个验证函数。我知道异常是用来处理错误和意外情况的,但在验证函数中,如果某个条件没有满足,我希望它返回 False 而不是抛出异常。

问题是,在验证完成后,我需要弹出一个消息窗口,显示类似于 "工具因为X条件未满足而退出" 的信息。我的工作流程是返回一个包含结果和消息的元组:

(True, Y_message)

或者 (False, X_condition_not_met)

然后:

a, b = result
if not a:
    raise_window(message=b)

不过最近我看到很多不同的观点,大家对这个问题有争议,我有点困惑。例如,有些人说应该总是使用异常:在Python中从函数返回多个值的最佳方法是什么?,而其他人则认为使用元组更好 在Python中处理错误和成功的返回值的最佳实践是什么?

如果有人能给我指个方向,我会很感激。

2 个回答

-2

在Python中,用异常来表示无效数据是一种常见的做法。举个例子,想想看int()这个函数,如果你给它传入了无效的数据,它就会抛出一个异常:

>>>> int('abc')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'
10

在进行验证的时候,你的函数主要是用来告诉你条件是否满足。你期待得到一个布尔值结果,也就是有效无效。只有在某些情况下,比如函数的输入不被支持,或者验证过程中需要的某些条件没有满足时,你才会抛出错误。在这种情况下,验证器的正常操作无法完成,因为它无法判断出有效无效

你可以把这和isinstance()issubclass()进行比较;这两个函数是用来测试一个值是否符合另一个值的。它们会返回TrueFalse,如果你给它们不支持的输入,就会抛出异常:

>>> isinstance(1, int)
True
>>> isinstance(1, 'foobar')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

正常的操作是进行验证,而给它不支持的输入意味着无法返回有效无效的值,因此需要抛出异常。

所以,对于一个返回(True, message)(False, message)元组的验证器,我只会在验证过程本身出现问题时抛出异常,而不是用来表示(False, message)的情况。

需要注意的是,你的验证器返回什么并不重要;如果你需要同时返回一个有效 / 无效的标志和相应的消息(而且只有验证器能生成这个消息),那么返回一个元组是完全可以的。

你也可以返回一个自定义的类:

class ValidationResult(object):
    def __init__(self, result, message=''):
        self.result = bool(result)
        self.message = message

    def __nonzero__(self):  # Python 2
        return self.result

    __bool__ = __nonzero__  # Python 3

    def __str__(self):
        return self.message

然后可以用它进行测试:

valid = validation(value)
if not valid:
    raise_window(message=str(valid))

撰写回答