You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:50:45