代码产生“ AttributeError”,而不是正确引发ValueError

时间:2019-09-13 01:42:12

标签: python attributeerror valueerror

我使用正则表达式来创建一个必须满足某些条件的函数(例如,不允许使用空格),并生成一个由特殊字符分隔的元组。

ex /输入字符串“ hello!world!hola”应产生一个元组(“ hello”,“ world”,“ hola”)。

如果字符串不符合我的条件,我想引发ValueError。但是,如果字符串不符合我的条件,我的代码将改为调用AttributeError。为什么函数未正确调用异常?

我试图调用ValueError,但是该函数似乎未捕获到我的异常。

def produce_tupule (s):

    re_pair = re.compile(r'''^                        
                           ([a-zA-Z0-9._+-]+)
                           \!                            
                           ([a-zA-Z0-9._+-]+)
                           \!
                           ([a-zA-Z0-9._+-]+)
                           $              
                        ''',
                        re.VERBOSE)
    try:
        return (re_pair.match(s).groups())
    except ValueError as e:
        print(e)

由于字符串中存在空格,因此我期望Produce_tupule('hello!world!hola')的输出将导致ValueError消息。

但是,错误消息指向'return:(re_pair.match(s).groups())'行并打印出AttributeError: 'NoneType' object has no attribute 'groups'

是什么导致函数无法捕获异常并产生AttributeError?

1 个答案:

答案 0 :(得分:1)

如果给定的正则表达式与您的输入不匹配,

re.match返回None而不是引发ValueError。然后,您的代码尝试访问.groups返回值的None成员,该成员以AttributeError失败。

如果您要在给定的正则表达式不匹配的情况下引发ValueError,则必须通过使用显式错误检查代码替换return (re_pair.match(s).groups())行来显式地这样做:

match = re_pair.match(s)
if match is None:
    raise ValueError
return match.groups()