python基礎之異常捕捉

一、異常的概述

1、概述

在python中有兩類錯誤會引發異常,一類是語法錯誤比如異常的鎖進,異常的函數名稱等;還有一類就是邏輯錯誤,比如1/0,0由於0是無法當作除數的,所以也會拋出異常。

而當程序的某個環節出現異常時,則會導致整個程序崩潰中止。

2、異常的種類

python中一切皆對象,因此異常也是由類產生,所有異常類的基類都是BaseException

以下是常見的類的種類:

  • AssertionError:當 assert 關鍵字後的條件爲假時,程序運行會停止並拋出 AssertionError 異常,assert關鍵字接下去會談到
  • AttributeError:當試圖訪問的對象屬性不存在時拋出的異常
  • IndexError:索引超出序列範圍會引發此異常
  • KeyError:字典中查找一個不存在的關鍵字時引發此異常
  • NameError:嘗試訪問一個未聲明的變量時,引發此異常
  • TypeError:不同類型數據之間的無效操作
  • ZeroDivisionError:除法運算中除數爲 0 引發此異常
  • Exception:可以捕捉任何異常

二、異常捕捉語法

1、try…except

在try代碼塊中包裹的代碼出現異常的時候,就會被except捕捉執行except代碼塊中的代碼。異常處理完畢後會繼續運行try代碼塊後面的代碼。

示例中Exception可以捕捉任何異常,也可以替換成相應的異常類,如果except沒有捕捉到異常,則代碼正常向後運行

mystr = 'base'
try:
    int(mystr)
except Exception as e:
    print(e)

print("主邏輯")

###執行結果
invalid literal for int() with base 10: 'base'
主邏輯

2、try…except…else

else代碼快中的內容是當沒有出現異常的時候會執行的代碼

mystr = '111'
try:
    int(mystr)
except Exception as e:
    print(e)
else:
    print("若代碼沒有異常則執行")

print("主邏輯")

###執行結果
若代碼沒有異常則執行
主邏輯

3、finally

finally中的代碼是無論出現異常與否都會執行的代碼

mystr = '111'
try:
    int(mystr)
except Exception as e:
    print(e)
else:
    print("若代碼沒有異常則執行")
finally:
    print("代碼無論是否有異常都會執行")

print("主邏輯")

### 執行結果
若代碼沒有異常則執行
代碼無論是否有異常都會執行
主邏輯

4、自定義拋出異常

4.1、在程序某處主動拋出異常

for i in range(10):
    if i == 3:
        raise ValueError("值爲3,退出")
    else:
        print(i)

###
0
1
2
Traceback (most recent call last):
  File "/Users/huyinjie/PycharmProjects/study/linetest.py", line 3, in <module>
    raise ValueError("值爲3,退出")
ValueError: 值爲3,退出

4.2、自定義異常

class MyError(BaseException):
    def __init__(self,msg):
        self.msg = msg


for i in range(5):
    if i == 3:
        raise MyError("拋出自定義異常")
    else:
        print(i)

5、斷言 assert

斷言會判斷後面表達式的值,若爲真,則繼續執行;若爲假則會拋出AssertionError異常。

assert expression[, arguments]

#這個if判斷和assert語法等價
if not expression:
    raise AssertionError(arguments)
>>> assert 1==1    # 條件爲 true 正常執行
>>> assert 1==2    # 條件爲 false 觸發異常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
def myres(name):
    if name == 'hyj':
        res = 1
    else:
        res = 0
    return res

res = myres('yang')
assert res==1,'驗證不同過'
print("驗證通過")

###執行結果
Traceback (most recent call last):
  File "/Users/huyinjie/PycharmProjects/study/linetest.py", line 9, in <module>
    assert res==1,'驗證不同過'
AssertionError: 驗證不同過
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章