Python3 教學 #04 (Ch6~Ch8: Try-catch 錯誤處理)
本章會介紹Python的Try-catch!
Try-catch: try 執行, except 例外, else 出錯就執行這區塊, finally 任何狀況下都要執行的區塊, raise 拋出錯誤Python的錯誤處理架構與Java或是其他程式語言差異不大,透過其他程式語言個觀念來思考可以加速理解喔!
藉由適當的錯誤處理,讓你的程式立於不敗之地~
(以下語法皆以Python3.6撰寫。)
Try-catch
語法
贊助廣告
1 2 3 4 |
try: # 你要執行的程式 except <錯誤類型>: # 發生錯誤時要執行的程式 |
我很確定可能的錯誤類型
下列三個範例,重點都在於建構Try-catch時要先考慮到執行這段程式時會發生哪些錯誤,
再把可能會發生的錯誤處理規劃好!
Python各類型錯誤(Python Exception Type):連結點我
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# 範例1 while True: try: # 直接將輸入值轉換成數字,所以輸入的不是數字就會引發錯誤! x = int(input("#1 請輸入數字: ")) print("#1 你剛才輸入的是:", x) break # 跳出迴圈 # 數值錯誤 except ValueError: print("#1 糟糕!你輸入的不是數字,請你再輸入一次!...") # 範例2 try: # 故意除以零 print("#2 {0}除以零!".format(x/0)) # 數值除以零的錯誤 except ZeroDivisionError: print("#2 {0}不能除以零,誰都不行!".format(x)) # 範例3 try: # 故意用了沒宣告過的變數『magic_number』 print("#3 兩數相乘: {0}", x * magic_number) # 變數未宣告的錯誤 except NameError: print("#3 變數未宣告的錯誤!") |
無法確定會發生什麼錯誤時的做法
那就用except吧!
1 2 3 4 5 6 7 |
import sys try: mm = 9 / 0 except: # sys.exc_info()[0] 就是用來取出except的錯誤訊息的方法 print("Unexpected error:", sys.exc_info()[0]) |
Output
1 |
Unexpected error: <class 'ZeroDivisionError'> |
拋出錯誤
raise 錯誤類型(“錯誤訊息”)
拋出錯誤的語法就是這麼簡單!
1 2 3 4 5 |
try: raise NameError("This is Name Error!") except NameError: print("We got Name Error!") raise |
Output
1 2 |
NameError: This is Name Error! We got Name Error! |
完整的Try-catch架構
Try-catch的完整結構應該是這樣:try, except, else, finally
try:需要被監控是否會出錯的程式區塊
except:出了哪種錯誤,要有怎樣相對應的處理
else:都沒錯誤,就會執行此區塊的程式
finally:不論如何都會執行此區塊的程式
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def divide(x, y): try: result = x / y except ZeroDivisionError: print("不能除以零!") else: print("相除結果是:", result) finally: print("不論如何都會執行finally") divide(2, 1) print("======") divide(2, 0) |
Output
1 2 3 4 5 |
相除結果是: 2.0 不論如何都會執行finally ====== 不能除以零! 不論如何都會執行finally |