iT邦幫忙

1

【Python】10.別讓一粒沙弄翻整艘船!用 try-except 幫你的程式裝上安全氣囊

  • 分享至 

  • xImage
  •  

前言

還記得「自動猜數字機」嗎?裡面有一行程式碼是 guess = int(guess)

假設今天有一個頑皮的玩家,在裡面輸入了文字 "哈囉"

電腦就把 "哈囉" 拿去用 int() 轉換,結果在螢幕上噴出紅字 ValueError: invalid literal for int(),然後整台程式直接當機、閃退死給你看。

如果這是一款已經上線、有幾萬人正在玩的遊戲,程式一閃退,所有人的紀錄就全沒了!所以為了防止這種悲劇,今天我們要學會用 try-except 幫程式裝上安全氣囊。

🚗 輕鬆譬喻:請幫車子裝上安全氣囊

很多新手寫程式,都只考慮到完美的狀況。
但厲害的工程師在寫扣時,腦子裡想的都是:「如果這裡出事了,我要怎麼讓程式優雅地活下來?」

在 Python 裡,攔截錯誤的語法叫做 try-except。

• try:(嘗試走這條路):把「有可能會出事、會閃退」的程式碼,通通保護在 try 部門底下。
• except:(萬一撞車時的應變措施):如果 try 底下的程式碼真的不幸爆炸了,電腦不會閃退,而是會瞬間彈出安全氣囊,直接跳到 except 部門執行你準備好的備用方案。

user_input = input("請輸入你的年齡:")
try:
    # 這行程式碼有可能因為使用者亂打字而爆炸
    age = int(user_input)
    print(f"原來你今年 {age} 歲啊!")
except ValueError:
    # 萬一真的爆炸了(發生了 ValueError),安全氣囊立刻彈出!
    print("❌ 欸!請不要亂輸入文字,這裡只能輸入『數字』好嗎?")
print("呼!程式沒有閃退,繼續執行後續的工作...")

🧠 觀察電腦的運作軌跡

• 狀況 A(乖乖牌):使用者輸入 25。try 順利把 25 轉成整數,印出年齡。except 發現沒事,直接休假。程式完美結束。

• 狀況 B(搗蛋鬼):使用者輸入 abc。try 執行到 int("abc") 時瞬間爆炸!但因為有安全氣囊,電腦立刻中斷 try 後面的事,秒速瞬移到 except,乖乖印出警告訊息。最重要的是,最後一行的「繼續執行後續的工作」依然有被印出來,程式安全落地,沒有閃退!

🎯 實戰改造:讓 Day 7 的猜數字機變成「完全體」

有了這個內功,我們馬上來改造 Day 7 的猜數字機。我們要確保不管玩家怎麼亂輸入文字,遊戲都絕對不會當機,而是會溫柔地提醒他重新輸入!
我們把 try-except 塞進 while 迴圈裡:

import random
answer = random.randint(1, 100)
print("=== 歡迎來到不閃退的猜數字機 ===")
while True:
    guess_raw = input("請輸入 1 到 100 之間的數字:")
    
    try:
        # ⚠️ 這裡最容易爆炸,用 try 保護起來
        guess = int(guess_raw)
    except ValueError:
        # 萬一轉型失敗,大喊一聲,並用 continue 直接重新跑迴圈
        print("⚠️ 抓到了!請輸入合法的『數字』,不要輸入英文或中文!")
        continue # 直接跳過下面所有的代碼,重新讓玩家輸入
        
    #如果順利通過 try,代表 guess 已經是乾淨的整數了,繼續原本的邏輯
    if guess > answer:
        print("❌ 太大了!再試一次。")
    elif guess < answer:
        print("❌ 太小了!再試一次。")
    else:
        print(f"🎉 恭喜你答對了!答案就是 {answer}!")
        break

快把這段 Code 丟進你的 VS Code 執行看看,然後故意輸入 "abc" 或 "貼圖",你會發現遊戲非但沒有死掉,還會很聰明地叫你「重新輸入」。這就是一個成熟專案該有的強健度!

🛑 終極警告:不要盲目使用「萬能安全氣囊」

有些新手學會這招後,覺得太棒了,以後不管寫什麼都這樣寫:

#❌ 這是不好的寫法!
try:
    # 寫了幾百行程式碼
except:
    print("出錯囉!")

在 except 後面不指名任何錯誤類型(這叫萬能例外攔截),雖然可以擋下所有閃退,但它會帶來一個極大的副作用:

把真正的 Bug 也一起隱瞞了。

萬一你程式碼裡不小心把變數名字拼錯(NameError),或者是陣列爆掉(IndexError),因為萬能安全氣囊把它無差別攔截了,螢幕上只會冷冷地印出一句「出錯囉!」,你根本不知道到底是哪一行、因為什麼原因出錯,這會讓未來的你 Debug 到瘋掉。

💡 新手村備忘錄:

盡量指名道姓你要攔截的錯誤(如 except ValueError:、except ZeroDivisionError:),精密防禦才是上策!

今日結語:你幫程式裝上安全氣囊了嗎?
今天我們學會了用 try-except 捕捉錯誤,讓我們的程式從「遇到挫折就閃退的溫室花朵」,升級成「撞不爛的裝甲車」。
接下來要來解鎖一個能幫程式寫日記、留紀錄的超能力。
不開檔案的程式就像金魚一樣,關掉就全忘光了!

下次學習如何用 Python 讀取與寫入 .txt 檔案,留下永久紀錄!

🧑💻 今日小作業

請試著在 VS Code 寫一段程式,讓使用者輸入兩個數字(被除數與除數),並算出相除的結果。
請用 try-except 同時防範以下兩種崩潰情況:

  1. 使用者亂輸入文字(ValueError)。
  2. 使用者在除數輸入了 0(提示:除以 0 會引發 ZeroDivisionError)。

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言