iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
AI & Data

看對話學 Python 資料分析,用情境故事帶你入門系列 第 18

Day-18 錯誤與例外處理,寫程式不用怕出錯(上)

  • 分享至 

  • xImage
  •  


寫程式不用怕出錯,就像小孩跌倒之後,爬起來馬上繼續玩一樣!Licensed by Adobe Stock

Meiko 與 Jason 約在一間親子餐廳見面,現在越來越多的親子教育,強調互動,小朋友在都市裡面不容易有活動的機會。親子餐廳讓大人朋友們可以一起相聚,也不怕小孩走丟,是一個讓家長放心的聚會場所。

Meiko:「Jason,看到這些小孩在遊戲區跑來跑去的,摔倒也不以為意,爬起來繼續玩,繼續狂奔,感覺真是開心!」

Jason:「對啊,小孩子都不怕受傷,用大人的角度來看,就是他們不怕出錯,爬起來手拍一拍就可以繼續玩了,有什麼大不了的?」

Meiko:「這讓我想起,先前在寫程式的時候,有時候也會出錯,我記得在使用list的時候,曾經出現,index out of range的錯誤,然後你告訴我改一下 index 馬上就可以再繼續寫下去!」

Jason:「寫程式好玩的地方就在於如果出錯的話,它會馬上跟你說,你剛提到的錯誤訊息 Error Message ,就是一個重要的資訊!」

Meiko:「不過單純自己看這些錯誤訊息,有時候還是不太容易馬上找到出錯的地方。」

Jason:「恩~妳可以想想看什麼時候會出現這樣的狀況?」

Meiko:「這是先前你給我的例子,我回家之後,自己嘗試改了一些程式碼,結果他就跟我說 SyntaxError 我找了好一陣子。還是不明白,因為他跟我說是在if price > 500:這行出錯,可是我來回改了好幾次還是不行。」

price = int(input("請輸入你的消費金額:")
if price > 500:
 print ("太貴了!別買!")
else:
 print ("價格 OK!")

Jason:「看起來這行沒問題,你要不要把上面那行後面的輸入input先拿掉,改成設定成 500 看會發生什麼事?」

Meiko:「好,我來試試!」

price = 500
if price > 500:
 print ("太貴了!別買!")
else:
 print ("價格 OK!")

Meiko:「Jason,沒有錯誤了耶,我把 price 設定成 500,因為條件判斷要大於 500 才會跟我說『太貴了!別買!』,所以它跑到 else 這個部分,告訴我『價格 OK!』,難道說,Syntax 的錯誤不在 if price > 500?」

Jason:「其實我剛才已經有發現,你在輸入的程式碼最後,少了一個括號 ) !」

price = int(input("請輸入你的消費金額:")

Meiko:「厚,你怎麼不早說,還叫我做別的事?」

Jason:「那你把括號加上去,看會發生什麼?」

price = int(input("請輸入你的消費金額:"))

Meiko:「誒,真的就一切正常了耶!」

Jason:「我覺得直接告訴你答案,你可能學不到東西。所以,我請你把price直接設定成一個數值,這樣你就可以發現,真正出錯的地方會在哪邊?」

Meiko:「歐,原來有時候出錯的地方,不一定是在錯誤資訊的那個提示?」

Jason:「對啊,像我跟你說的這樣,我的思路會像下面這樣(其實是心裡的 OS 拉),

  1. 原來if price > 500這行沒錯,那應該是前面出錯囉?
  2. 去修改了前一行的程式,發現沒錯!
  3. 那應該是原本打的 int(input(“請輸入你的消費金額:”) 這行有問題,仔細一看就會發現,原來是少了一個括號。

Meiko:「Jason,你好像在撥洋蔥唷,一層層的把問題拆解,然後再把他們還原出來。」

Jason:「撥洋蔥?我有一次在廚房流淚,就是洋蔥惹的禍。話說回來,SyntaxError 常常就是初學者,在輸入程式碼的時候,忘了加括號『)』 、引號『“』、冒號『:』這幾個符號,小心一點應該就漸漸熟悉程式語言的限制。」

Meiko:「誒,你才剛說完,我又犯了一個 SyntaxError 。」

price = 500
if price = 500:
 print ("價格剛好!")
elif price > 500:
 print ("太貴了!別買")
else:
 print ("價格 OK!")

Jason:「這次,就比較簡單了,這個price = 500是不符合語法的唷,在 Python 程式裡面,要判斷是否等於,會是 2 個等號==而不是一個等號=。」

Meiko:「歐,原來,難怪會出現這個錯誤!把它改成 2 個等號,就成功印出『價格剛好』!」

price = 500
if price == 500:
 print ("價格剛好!")
elif price > 500:
 print ("太貴了!別買")
else:
 print ("價格 OK!")

Meiko:「既然我們今天討論到錯誤的狀況,那你幫我看一下這邊哪裡錯?」

priceJeans=500
if priceTshirt == 500:
 print ("價格剛好!")
else:
 print ("價格 OK!")

Jason:「歐,因為你的判斷條件寫的是priceTshirt == 500,可是你前面宣告的變數是priceJeans = 500 啊,所以你沒有定義到priceTshirt這個變數,電腦就找不到它,只好跟你說是 NameError 了!」

Meiko:「啊對轟,有時候打太快就變成這樣。我腦袋想的是牛仔褲,下一秒想到有一件 T shirt 不錯看,沒想到腦袋跟手就沒辦法一起協調工作。對了,之前我還是不太熟悉字串和數字的差別,就是整數int和字串str,我把一個數字的 500 和 一個字串的 500 加在一起,電腦就出現這個錯!」

print (500+'500')

Jason:「簡單來說就是數字不能和字串相加,蘋果和橘子就是不一樣,對吧?」

Meiko:「恩,不過我如果把 500 的字串放在前面,好像得出來的錯誤訊息不太一樣?」

print ('500'+500)

Jason:「因為程式在編譯你這行程式碼的時候,發現第一個字是字串,所以它會認定你應該是要印出一個字串,才會告訴你 must be str, not int !」

Meiko:「歐,原來,因為我輸入的內容不同,錯誤的方式不同,程式判斷出來的錯誤訊息也不一樣。」

Jason:「對啊,就像我前面說的,程式有固定的語法,就像你說中文有中文的語法,說英文會有文法一樣,所以它會根據你輸入的內容,來做判斷也是很合理的!」

牛刀小試

我大寶寶~拉,今天介紹了一些錯誤的狀況該怎麼避免,其實大寶寶一直以來寫程式也都是看這些錯誤狀態來幫助自己解 bug,所以說當遇到錯誤狀況的時候不用慌張,只要記得找到出錯的位置就可以囉!就像文章裡面提到,有時候出錯的位置不一定顯示在錯誤資訊的那個位置,所以可能的話,就是往前或是往後走幾步,簡單來講寫程式就是想辦法確認程式印出來的結果,跟自己想的是一模一樣的,只要可以做到這樣,就是成功的第一步囉!

給大寶寶留言、分享、鼓勵

歡迎登入留言跟我分享你的想法唷!(登入不麻煩,點一下 FB 登入就可以留言了!)

1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.如果前面的內容忘記了,趕快看一下大寶寶這一系列的看對話學 Python 資料分析,用情境故事帶你入門的列表!就能夠繼續 Happy Coding 囉!


上一篇
Day-17 模組 module,除了自己努力外,也要站在巨人肩膀上
下一篇
Day-19 錯誤與例外處理,寫程式不用怕出錯(下)
系列文
看對話學 Python 資料分析,用情境故事帶你入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言