Python 教學 — 異常處理 try…except…finally…

Eddie
4 min readJul 2, 2020

--

這禮拜再寫 code的時候,遇到了大量需要自訂異常處理的狀況,通常這種情形,就需要用到 try…except…來輔助處理異常的情形。那麼 try…except…這些指令該怎麼使用呢?這邊就用簡單的範例來解釋吧~~

def main(a,b):
c= a+b
return c
if __name__ == '__main__':
main(1,2)

上面的 function 只要傳入兩組數字a與b,就可以回傳倆數字的和 c 給使用者。但是如果你今天傳入的不是數字呢,那會發生什麼事情呢?

def main(a,b):
c= a+b
return c
if __name__ == '__main__':
main(1,'a')
# TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’

沒錯!就是 TypeError,數字是不能夠跟字串相加的,這時 python 就會跳出錯誤訊息出來。這時如果你不想要讓程式直接跳出錯誤訊息,而是用你想要的方式去處理異常,這時就交給今天的主角 try… except…吧~

我們將原本的 function 改寫成下面這樣:

def main(a,b):
try:
c= a+b
return c
except:
print('please input int')
if __name__ == '__main__':
main(1,'a')
# please input int

將原本要執行,並且可能出現錯誤的程式碼放到 try 下面。當程式出現錯誤時,這時會進入 except 區塊內,並且傳回區塊內的訊息。

def main(a,b):
try:
c= a+b
return c
except TypeError:
print( 'please input int')
except:
print('other error')
if __name__ == '__main__':
main(1,'a')

此外,我們也可以依照不同的異常訊號來去執行不同區塊的except。在 except 後方傳入特定的異常類型,而單純只有 except 的區塊則會處理其餘的異常。

這邊另外介紹一個方法 raise,他可以被包在 try 裡面,可以當作我們自定義的異常訊息。

def main(a,b):
try:
c= a+b
if c>10:
raise Exception('c is too big')
print(c)
except TypeError:
print( 'please input int')
if __name__ == '__main__':
main(1,11)
# Exception: c is too big

當 c >10 時則會跳出異常訊息 “Exception(‘c is too big’)”,並請不會進入 except 的區塊內部。

最後呢… 就用個 finally 來當作結尾吧

def main(a,b):
try:
c= a+b
if c>10:
raise Exception('c is too big')
print(c)
except TypeError:
print( 'please input int')
finally:
print('終於結束啦~~')
if __name__ == '__main__':
main(1,2)
# 3
# 終於結束啦~~

finally 區塊內的指令呢,是不論如何一定會被執行的區塊,通常都會被放在最後執行,所以他才叫做 finally 拉。

--

--