首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Python try-except 捕獲異常機制詳解:為什麼 int('2.3') 會拋出 ValueError?

     編輯:程式設計疑難解答

代碼現象

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+$避免異常開銷

最佳實踐建議

  1. 具體捕獲異常類型:except ValueError: 而非裸 except:,避免吞掉 KeyboardInterrupt、SystemExit 等關鍵異常。
  2. 異常處理後可選重新拋出:except ValueError as e: log(e); raise。
  3. 使用 else 塊:try: ... except ValueError: ... else: print('轉換成功:', val),僅在無異常時執行。
  4. 使用 finally 塊:釋放資源 (關閉文件、連接) 保證執行。
  5. 輸入驗證前置:if re.match(r'^[\+\-]?\d+$', val): val = int(val),用條件判斷替代異常控制流,性能更好、語義更清晰。

總結

int('2.3') 拋出 ValueError 是因為字符串包含小數點,不符合整數字面量格式。異常導致 try 塊中斷,val = int(val) 賦值未完成,直接進入 except。理解「異常即控制流中斷」是掌握 Python 錯誤處理的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved