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  | 
