ValueError与TypeError的区别:为何字符串转int触发ValueError?
问题解答
为什么触发ValueError而非TypeError?
你对两种异常的理解是准确的:
- TypeError:当传入的参数类型完全不被函数支持时触发。比如给
int()传列表int([1,2])、字典这类完全无法处理的类型,才会抛出TypeError。 - ValueError:参数类型是函数接受的,但值不符合规则时触发。
int()本身支持接收字符串参数——只要字符串是合法的十进制数字(比如"123")就能转换成功。你传入的"yes"是字符串类型(符合参数类型要求),但它不是有效的十进制数字字面量,所以触发ValueError。
代码问题修复方案
你的try-except只捕获了TypeError,但输入非数字字符串时实际抛出的是ValueError,导致异常未被处理、程序报错终止。只需将捕获的异常改为ValueError即可:
def place_bet(self): while True: response = input("Make Bet (1/2/5/10/25/50/100): ") try: current_bet = int(response) except ValueError: # 改为捕获实际会触发的ValueError print("Please Enter a Valid number") else: if current_bet not in (1, 2, 5, 10, 25, 50, 100): print("Sorry, only bets of exactly 1, 2, 5, 10, 25, 50 & 100 are allowed.") else: self.balance -= current_bet self.bet = current_bet print(f"${self.bet} BET PLACED") break
如果想兼容极端情况下可能出现的TypeError(比如后续修改代码导致传入非字符串类型),可以同时捕获两种异常:
except (TypeError, ValueError): print("Please Enter a Valid number")
内容的提问来源于stack exchange,提问作者Infinite Grasp
相关产品推荐
相关产品推荐

