验证和异常与错误消息元组

时间:2014-05-26 17:29:37

标签: python exception tuples

我正在研究验证功能。我理解异常用于错误和意外情况,但在验证函数的情况下,如果内部不满足条件,我希望它返回False而不是异常。

事情是,在验证完成后,我需要使用如下消息来引发消息窗口:"Tool exited because X condition not met"。我的工作流程是返回带有结果和消息的元组:

(True, Y_message)

或     (假,X_condition_not_met)

然后:

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

然而,最近我偶然发现多个答案引发了关于这个问题的争议,我很困惑。例如,有些人说要始终使用例外情况:What's the best way to return multiple values from a function in Python?而其他人说元组是走的路Best practice in python for return value on error vs. success

如果有人能指出我正确的方向,我将不胜感激。

2 个答案:

答案 0 :(得分:9)

验证时,您的功能的目的是告诉您是否符合条件。你希望得到一个布尔结果; 有效无效。例如,如果不支持函数的输入,或者未满足验证过程本身的某些依赖性,则只会抛出错误。在这种情况下,验证程序的正常操作无法完成,在这种情况下您无法返回有效无效,因为验证程序无法做出该确定

您可以将其与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)元组的验证程序,我只会在验证过程本身出现问题时引发异常,而不是指示{ {1}}案例。

请注意,验证器返回的内容并不重要;如果你需要返回有效的 / 无效标志和相应的消息(并且只有验证器可以产生该消息),那么返回一个元组就可以了。

您也可以返回自定义类:

(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

答案 1 :(得分:-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'