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