這禮拜再寫 code的時候,遇到了大量需要自訂異常處理的狀況,通常這種情形,就需要用到 try…except…來輔助處理異常的情形。那麼 try…except…這些指令該怎麼使用呢?這邊就用簡單的範例來解釋吧~~
def main(a,b):
c= a+b
return cif __name__ == '__main__':
main(1,2)
上面的 function 只要傳入兩組數字a與b,就可以回傳倆數字的和 c 給使用者。但是如果你今天傳入的不是數字呢,那會發生什麼事情呢?
def main(a,b):
c= a+b
return cif __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 拉。