val = input('enter:') # 用戶輸入 2.3
try:
val = int(val) # 這裡拋出 ValueError
print(val)
except:
print('not an int.') # 輸出: not an int.
int() 只能轉換「整數字面量」字符串,即匹配正則 ^[\+\-]?\d+$ 的字符串。
int('2') → 2 ✅int('2.3') → **ValueError: invalid literal for int() with base 10: '2.3'** ❌int(' 2 ') → 2 ✅ (自動 strip 空白)int('0x10', 16) → 16 ✅ (指定進制)input('enter:') → 用戶輸入 "2.3" → val = "2.3" (str)
↓
try:
val = int(val) → 嘗試解析 "2.3" → 發現小數點 '.' 不合法
↓
**拋出 ValueError 異常對象**
↓
**跳過 print(val) 及 try 塊剩餘代碼**
↓
except: → 捕獲 ValueError (裸 except 捕獲所有異常)
↓
print('not an int.') → 輸出提示
↓
程序正常結束
異常一旦拋出,當前 try 塊剩餘語句不再執行,控制權立即轉移到匹配的 except 塊。這就是為什麼 val = int(val) 賦值語句**沒有完成** (val 仍為字符串 "2.3"),直接跳轉到 except。
| 需求 | 代碼 | 結果 |
|---|---|---|
| 截斷小數部分 (向零取整) | val = int(float(val)) | '2.3' → 2, '-2.9' → -2 |
| 四捨五入 | val = round(float(val)) | '2.3' → 2, '2.5' → 2 (銀行家算法), '2.6' → 3 |
| 向上取整 | val = math.ceil(float(val)) | '2.1' → 3 |
| 向下取整 | val = math.floor(float(val)) | '2.9' → 2 |
| 先判斷是否為純整數字符串 | val.isdigit() (僅正整數) 或 正則 ^[\+\-]?\d+$ | 避免異常開銷 |
except ValueError: 而非裸 except:,避免吞掉 KeyboardInterrupt、SystemExit 等關鍵異常。except ValueError as e: log(e); raise。else 塊:try: ... except ValueError: ... else: print('轉換成功:', val),僅在無異常時執行。finally 塊:釋放資源 (關閉文件、連接) 保證執行。if re.match(r'^[\+\-]?\d+$', val): val = int(val),用條件判斷替代異常控制流,性能更好、語義更清晰。int('2.3') 拋出 ValueError 是因為字符串包含小數點,不符合整數字面量格式。異常導致 try 塊中斷,val = int(val) 賦值未完成,直接進入 except。理解「異常即控制流中斷」是掌握 Python 錯誤處理的關鍵。