Jimmy's Code

Want to be a better Coder
^

python 起手式:Error Handling-以猜數字遊戲為例

2018-10-04

python同樣與其他語言一樣,也有他的Error Handling, 什麼是Error Handling呢?程式有輸入也有輸出,還有控制的過程,但萬一在過程當中出錯了怎麼辦?就像郵局從寄信方收到信件、最後要經過處理、透過郵差送信給收信方,在這樣繁複的過程中,有可能會出現一些問題而導致收信方收不到信件。

對於程式本身,有哪些地方會出錯呢?這裡我以短短幾年工程師生涯所遇到的雷來談談~
程式本身沒有錯,錯的是撰寫程式的人XD(好悲催~) 好啦!這也就是我們工程師存在的價值啦!沒有人能夠一定保證程式永遠都不會出錯~ Garbage in Garbage out,使用者習慣與環境千千百百種,都會有可能有當初撰寫程式者沒有預期到的輸入,況且,在軟體工程界當中:「沒有不變的需求」,可能這一段時間他可以完全無誤地跑,但有可能以後時間長了或者增加了新需求後,就不能跑了…

還有啊,有時候也不見得是程式撰寫者及程式本身的錯誤,在寫程式的過程當中,有時會呼叫外部的函式庫或外部的API,這有時也不是你的錯,但就這麼剛好他回傳或者你送出的就不是你所期待的,那麼就會噴錯了。

為了解決當程式面對這些error可以仍持續地執行下去。你就一定要有error handling,以確保使用者不會“驚嚇”到

關於python的error handling 敘述如下

try:
    {statement area}
catch (error type),(value):
    {error handing}
else:
    { statement area continue...}
finally:
    {finally area}

說明:
在python界當中,縮排和’:’很重要!請務必注意!
而catch後面的 error type和value 不一定要加,你也可以單純的’catch:‘這樣一行帶過
至於error type你可以參考這個網址
else 則是當try所包的statement無誤的時候會執行的。
最後finally子句就是無論try或有沒有取得exception,都會執行的區域,php同樣也有類似finally的敘述。

以昨天寫的猜數字小遊戲為例子,可能出錯的就是input那一塊,因為input是由使用者輸入的,萬一使用者輸入的不是數字怎麼辦呢?同時,我們也加入可以計算你猜數字的次數需求。
所以會改成底下這個樣子:


import random
ans =  random.randint(0,10) #取從1到10的亂數
times = 0
print('請猜一個0~10的數字')
play = True

while(play):
    try:
        guess = int(input('來隨便猜一個數字吧: ')) #input出來預設為str,轉型為int
    except:
        print('程式出現非預期的錯誤,遊戲結束,答案是'+str(ans))
        #str()是將數字轉文字,'+'串接的必須是同樣的型態。
        play = False
    else:
        times = times+1 #每猜一次就要+1
        if (guess > ans):
            print('喔你猜得太大囉')
        elif (guess < ans):
            print('喔你猜得太小囉')
        else:
            print('恭喜你猜對了!')
            play = False
    finally:
        print('你猜了'+str(times)+'次') 

說真的,我寫程式也很少寫error handling,我也是邊查資料邊寫邊做的。如果有錯誤或者要補充的歡迎來指教及提醒。

參考網址

r567tw

住在台北的一位台東developer,最喜歡"忠心"這個形容詞。這一生希望完成三件事:寫一本書、站在TED演講並且想要成為福音及各種學科的橋梁,希望自己能從基督教的思考框架出發與各學科傾聽、回應、對話