Hike News
Hike News

Python基礎-異常處理

Introduction:

可自訂義當程序出錯時,自動執行其他程序或做其他處理

Example:

1
2
3
4
5
6
7
try:                    #代碼塊,邏輯
inp = input("請輸入序號")
i = int(inp)
except Exception as e: #上述代碼塊如出錯,自動執行當前塊的內容
print("發生錯誤: ",e)
i = 1
print(i)
  • 要是try代碼塊中的代碼沒有出錯則會繼續執行
  • 要是try代碼塊出錯則會創建Exception類(class)對象,對象名為e,e中封裝了出錯的錯誤訊息

Types of Error:

任何的錯誤訊息都會有一個對象來表示此錯誤訊息為何

Exception (BOSS級) 可捕獲任何異常訊息
IndexError
ValueError
AttributeError
ImportError
IndentationError ….等等

Application:

可同時捕獲多種不同的錯誤,讓其進行不同的程序(錯誤的細項放前面執行,最後才用Exception)

1
2
3
4
5
6
7
8
try:
int("w3r")
except IndexError as e:
print("發生錯誤: ",'IndexError',e)
except ValueError as e:
print("發生錯誤: ",'ValueError',e)
except Exception as e:
print("發生錯誤: ",'Exception',e)

Usage:

else

在except之後鍵入else:

  • 要是try代碼塊中執行代碼出錯 → 會捕捉錯誤訊息並執行except代碼塊中的程序
  • 要是try中代碼塊中的代碼執行沒有出錯 → 當try代碼塊中代碼執行完成時則會執行else代碼塊中的程序
1
2
3
4
5
6
7
8
9
10
try:
int("w3r")
except IndexError as e:
print("發生錯誤: ",'IndexError',e)
except ValueError as e:
print("發生錯誤: ",'ValueError',e)
except Exception as e:
print("發生錯誤: ",'Exception',e)
else:
print("else","執行代碼並無發生錯誤")

finally

最後不管有無出錯皆會執行finally代碼塊中的代碼

1
2
3
4
5
6
7
8
9
10
11
12
try:
int("w3r")
except IndexError as e:
print("發生錯誤: ",'IndexError',e)
except ValueError as e:
print("發生錯誤: ",'ValueError',e)
except Exception as e:
print("發生錯誤: ",'Exception',e)
else:
print("else","執行代碼並無發生錯誤")
finally:
print("finally:....","不管最後有沒有出錯都要執行我")

Advanced :

主動觸發異常

上述所說都是由Python內部解釋器解釋時所觸發的異常
我們也可以讓程序運行時主動觸發異常 → 使用raise

1
2
3
4
try:
raise Exception("出現異常")
except Exception as e:
print(e)

  • 用於嵌套函數中某函數執行失敗並retrun False時拋出異常,並讓日誌紀錄
  • 不必在另外寫一個函數用於紀錄日誌
  • 只需將出錯訊息進行raise Exception 於except Exception代碼塊中連同其他出錯訊息一起記錄

自訂義異常(編寫一個類)

1
2
3
4
5
6
7
8
9
class self_definitionError(Exception):
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message
try:
raise self_definition('自訂義錯誤')
except self_definitionError as e:
print(e) #使用print方法,則會調用e對象的__str__()方法,獲取值後返回

assert(斷言)

assert 後的條件成立則繼續執行,條件不成立時 程序報錯為AssertionError
用於強制用戶服從,不服從則報錯,可用Exception捕獲異常,但一般不會這麼做

example I

條件成立,沒有發生異常

1
2
assert 1 == 1
print('OK')

顯示:

1
OK

example II

條件不成立,發生AssertionError異常

1
2
assert 1 == 2
print('OK')

顯示:

1
2
3
Traceback(most recent call last):
assert 1 == 2
AssertionError

conclusion

多線程會使用到此方法,通常用在寫好的程序中前面加入assert條件判斷
欲使用程序必須滿足assert後面的條件才能運行
類似if else