我在Python代码中的两个不同位置引发异常:
holeCards = input("Select a hand to play: ")
try:
if len(holeCards) != 4:
raise ValueError(holeCards + ' does not represent a valid hand.')
AND (编辑以纠正提升代码)
def __init__(self, card):
[...]
if self.cardFace == -1 or self.cardSuit == -1:
raise ValueError(card, 'is not a known card.')
出于某种原因,第一个输出像我预期的串联字符串:
ERROR: Amsterdam does not represent a valid hand.
但是,第二个输出了一些奇怪的set和string混合:
ERROR: ('Kr', 'is not a known card.')
为什么“+”运算符在这两种情况下表现不同?
编辑:对init的调用如下所示:
card1 = PokerCard(cardsStr[0:2])
card2 = PokerCard(cardsStr[2:4])
答案 0 :(得分:8)
raise ValueError(card, 'is not a known card.')
与
raise ValueError(card + ' is not a known card.')
???
第二个使用“+”,但第一个使用“,”,它确实应该给你显示的输出!
(在某些情况下,问题是从带有“+”的版本编辑的。也许这个问题应该删除???)
答案 1 :(得分:5)
“card”可能代表一个包含字符串“Kr”的元组。在元组上使用+运算符时,可以创建一个添加了额外项的新元组。
编辑:不,我错了。将字符串添加到元组:>> ("Kr",) + "foo"
生成错误:
TypeError: can only concatenate tuple (not "str") to tuple
确定“卡片”的类型可能会有所帮助。你知道它是什么类型的吗?如果没有,请尝试输入如下的打印语句:
if len(card) != 2:
print type(card)
raise ValueError(card + ' is not a known card.')
答案 2 :(得分:4)
使用单个参数(您的连接(或添加)字符串:
)实例化ValueError异常raise ValueError(holeCards + ' does not represent a valid hand.')
这实现了带有2个参数的ValueError异常,无论卡是什么,还是字符串:
raise ValueError(card, 'is not a known card.')
答案 3 :(得分:1)
在第二种情况下,card
不是一个确定的字符串。如果它是一个字符串,那么len('2')
将等于2并且不会引发异常,所以首先检查你想要连接的是什么,似乎添加到字符串的东西返回表示为元组的东西。
我建议您使用字符串格式而不是字符串连接来创建错误消息。它将使用对象的字符串表示形式(__repr__
)。
使用字符串格式:
>>> "%s foo" % (2)
'2 foo'
使用字符串连接:
>>> 2 + " foo"
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: unsupported operand type(s) for +: 'int' and 'str'
还有其他问题......你使用的是什么python版本/实现?我在Linux上的cpython解释器将ValueErrors报告为ValueError
,而不是ERROR
...
答案 4 :(得分:0)
您是否在代码中的某处重载__add__()
,这可能导致它返回元组或其他内容?