什麼是異常處理以及異常處理的方式

錯誤分爲兩種,一種爲語法錯誤,一種爲邏輯錯誤
異常就是程序運行錯誤時發出的型號,或者說是程序運行崩潰的結果
常用異常:
AttributeError試圖訪問一個對象沒有的屬性,比如調用Foo.x,但是Foo下沒有x屬性
IOError輸入/輸出異常,基本上是無法打開文件的
ImportError無法引入模塊或包,基本上是路徑問題或者名稱錯誤
IndentationError語法錯誤的子類,代碼沒有正確對齊
IndexError下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyboardInterrupt 這個是在解釋器中按下了ctrl+c
NameError使用了一個還未被賦予對象的變量
SyntaxError非法python代碼,個人覺得就是語法錯誤
TypeError傳入對象類型與要求類型不符合
UnboundLocalError視圖訪問一個還未被設置的局部變量,基本上是猶豫另一個同名的全局變量,導致你認爲正在訪問它
ValueError傳入一個調用者不期望的值,即使值得類型是正確的
爲什麼要進行異常處理?
異常處理的目的就是捕捉到產生異常的代碼,使整個代碼不會崩潰而終止,讓邏輯繼續走下去
其實if也可以做異常處理,但是if的缺點很多,比如說重複代碼的使用和可讀性差等等:

def test():
    print('lalalalalalala')
chioce = {
    '1':test
}
while True:
    chioce_q = input('>>>:').strip()
    if not chioce or chioce_q not in chioce:
        continue
    chioce[chioce_q]()

所以python唯每一種異常定製了一個類型,然後提供了一種特定的語法結構來進行異常處理

try:
	被檢測的代碼塊
exxept	異常類型:
	try中一旦檢測到異常,就執行這個位置的邏輯代碼

下面是一個將輸入的字符轉換成爲int類型的異常處理:

try:
    age = input('>>>')
    int(age)
    num = input('>>')
    int(num)
except ValueError as e:#as是給他起個名字
    print(e)

異常類只能用來處理指定的異常情況,如果非指定異常則無法處理,比如說你在except後面寫的是ValueError但是是因爲超出取值範圍導致的異常,程序還是會終止,這時就可以用多分支或者萬能異常來處理:
多分支:

try:
	age = input('>>')
	int(age)
	l = [1,2]
	l[10]
except ValueError as e:
	print(e)
except IndexError as e:
	print(e)

萬能異常:

try:
	age = input('>>>')
	int(age)
	l = [2.3]
	l[10]
except Exception as e:
	print(e)

Exception表示所有的異常都按照一種邏輯去處理,但是假如需要不同的異常需要定製不同的處理,就需要使用多分支了,也可以在多分支後面也加入一下Exception,就相當於if…elif…else
但是try中也else,但是和if…else中的截然相反

try:
	監測代碼
except Exception:
	異常後的邏輯代碼
else:
	print('try中代碼塊沒有異常則執行我')
finally:
	print('無論一場與否,都會執行我,通常是進行清理工作')
	#比如說打開文件然後操作文件導致文件未關閉

斷言
關鍵字assert

def test1():
    res = 1
    return 1
res1 = test1()
assert res1  == 2
#上面的assert和下面的if一致
if res1 != 2:
    raise AttributeError

然而try…except應該少用,因爲他本身就是你附加給你程序的一種異常處理的邏輯,與你的主要工作是沒有關係的,只有在有些一場無法預知的情況下才應該加上try…except,其他邏輯錯誤應該儘量修正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章