小孩跌倒不用怕,爬起來繼續奔跑,這就好比寫程式的例外處理,搞定錯誤,也能開心向前衝! Licensed by Adobe Stock
前次 Jason 跟 Meiko 提到寫 Python 有可能遇到的錯誤狀況也跟 Meiko 提到說該怎麼才能進行修改,接下來 Meiko 想到更多關於程式出錯的問題,讓我們繼續看下去囉...
Meiko:「Jason,我想到一件事,從前面這些錯誤狀態像 SyntaxError、NameError、TypeError 程式出錯的話,就會晾在那邊不動,可是萬一我寫的程式有很多行,除了出錯的地方之外,後面還有許多重要的事情還沒執行,那該怎麼辦?」
Jason:「的確唷,在程式裡有例外處理的機制,萬一出錯的話,就可以讓程式繼續執行其他沒有出錯的區塊,才不會影響後續要做的事!」
Meiko:「原來已經有人這樣想了呀?」
Jason:「對啊,來舉個例子,比如說你想要輸入 2 個數字,然後用程式把它們加起來,如果一切正常的話,你輸入兩個數字,一個 10 一個 20,那程式就會正常的用print()
輸出a+b
的和,30 出來。」
try:
a = int(input("請輸入第一個數字:"))
b = int(input("請輸入第二個數字:"))
print (a+b)
except:
print ("輸入型態錯誤!請輸入數字!")
Meiko:「從結果看起來感覺不到差別耶,要顯示這樣的結果,即使不用try-except
也可以做到啊?」
Jason:「因為,我們乖乖照程式的指示輸入數字,型態沒有問題所以結果是正確的,你當然看不出來差別。來,我們看看輸入錯誤的資訊,比如說它要輸入數字,你輸入你的名字,看會發生什麼事?」
Meiko:「誒,真的耶,程式就跑到except
的那個區塊,印出『輸入型態錯誤!請輸入數字!』了。」
Jason:「對啊,我們再往回頭一步,如果我們不使用try-except
看會發生什麼事?
a=int(input("請輸入第一個數字:"))
print (a)
Meiko:「哇,真的出錯了!顯示 ValueError!」
Jason:「你看,程式出現錯誤訊息,並且晾在那邊不動了。這個錯誤,它是一個 ValueError,因為程式沒有辦法把字串 Meiko 轉換成數字的內容。」
Meiko:「這樣我大概知道,有try-except
的差別了,還有別的要注意的嗎?」
Jason:「有時候,我們可能做一些數據分析,看銷貨成績會用比率的方式。舉個例子,假設我們想要比較不同月份的績效,但是有些品項比較冷門,如果這個月賣 5 件,上個月賣出 0 件,如果我們把 5 除 0 想去得到銷售比值(用來了解銷售的變化),就會出現錯誤狀態 ZeroDivisionError (分數相除時,分母不能為 0),這個時候except
就可以設定成專門的例外處理。像這樣
try:
a=int(input())
b=int(input())
c=a/b
except ZeroDivisionError:
print ("不能除 0 !")
except:
print ("輸入型態錯誤")
Jason:「你看在這個例子當中,a 是 5,b 是 0,相除就跑到了except
ZeroDivsionError 那個區塊,所以就印出了『不能除 0!』的訊息。」
Jason:「如果再更完整一些,我們會用下面這個方式去完整的處理例外狀況,你看除了try-except
特定名稱及其他狀況之外,我們把try
執行後的結果,放在 else 的部分印出來。」
try:
a=int(input())
b=int(input())
c=a/b
except ZeroDivisionError:
print ("不能除 0 !")
except:
print ("輸入型態錯誤")
else:
print ("銷售比率是 %s"%(c))
finally:
print ("完成計算")
Meiko:「我想到另外一個例子,我們上個月有一個 A 產品賣了 50 個,B 產品賣了 20 個,我們可以用這兩個數字帶進去 a 和 b 嗎?我來試試!」
Jason:「沒問題,你看程式執行try
的部分,讓你輸入a
和b
的數值,並且把a/b
的數值指定到c
這個變數裡面,因為型態是正確的,沒有例外狀況(不跑到except
的區塊),所以程式最後會執行else
印出『銷售比值是 2.5』和finally
『完成計算』的區塊。」
Meiko:「這樣好像就不用擔心,自己寫的程式出錯的話會怎麼辦了,感覺蠻好的!」
Jason:「對啊,現在因為你目前寫的程式還短,可能還看不出try-except
有多大的用處,可是如果當你的程式是和許多人一起合併在一起使用,你就會想要小心一些,把不同的錯誤狀況都考慮進來,才不會因為一點點小錯,讓整個系統晾在那邊!」
Meiko:「這就像我們眼前這些小朋友不管怎麼跌倒,他們都還是會繼續跑起來奔跑是一樣的意思?」
Jason :「我想你完全抓到重點了!」
我大寶寶~拉,今天介紹了程式的例外處理,以前大寶寶還不知道這樣的方式,當程式碼出錯的時候,就會讓整個程式都卡住,有了例外處理就能解決這樣的問題。
當然程式碼還是不要出錯比較好,可是我們在寫程式的時候,總是有可能有出錯的時候,有些情況就是沒辦法在寫程式的當下想到,這個時候,使用try-except
例外處理,就能幫我們處理這樣的情況。
下次當你在寫程式的時候,也可以開始思考,運用try-except
的方式來進行唷!
歡迎登入留言跟我分享你的想法唷!(登入不麻煩,點一下 FB 登入就可以留言了!)
1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.如果前面的內容忘記了,趕快看一下大寶寶這一系列的看對話學 Python 資料分析,用情境故事帶你入門的列表!就能夠繼續 Happy Coding 囉!