1.判斷是否斷開的預言
assert 表達式 , 描述
表達式為我們的預期結果,當表達式的結果為False時,拋出 AssertionError 異常,如無異常捕獲則結束程序運行。表達式結果為True 程序繼續(xù)向下運行。慎用,尤其是寫測試用例時,因為我們運行程序時,如果斷言失敗,無異常捕獲程序會結束運行。一般用在防御型的編程、運行時檢查程序邏輯、檢查約定、程序常量、檢查文檔時
class Circle(object):
? pi = 3.14
? def __init__(self, r):
? ? ? self.r = r
? def area(self):
? ? ? assert self.pi == Circle.pi, 'pi 值被修改'
? ? ? return self.pi * self.r ** 2
circle1 = Circle(2)
#circle1.pi = 5
print(circle1.area())
2.異常都可以是錯誤,但是錯誤不一定是異常
語法錯誤:或者稱之為解析錯,程序無法解析或者編譯
1、語法錯誤:代碼不符合解釋器或編譯器的語法,如:print()輸出單詞出錯
2、邏輯錯誤:不完成或者不合法的輸入或者計算機出問題,如:死循環(huán)
異常:執(zhí)行過程中出現(xiàn)問題導致程序無法執(zhí)行
1、程序遇到邏輯或者算法問題,如:1/0
2、運行過程中計算機錯誤,如:內(nèi)存不夠或者IO錯誤
異常出現(xiàn)的過程:
1、異常產(chǎn)生,檢查到錯誤且解釋器認為是異常,拋出異常
2、異常處理,截獲異常,忽略或者終止程序處理異常
3.異常
運行期檢測到的錯誤被稱為異常,大多數(shù)的異常都不會被程序處理,都以錯誤信息的形式展現(xiàn)
4.異常處理 try...except...else...finally...
try...except...else...finally...使用順序,else必須在except后finally前,finally只能在最后;else與 finally可有可無
while True:
? try:
? ? ? i = int(input('接收一個除數(shù):'))
? ? ? print(2 / i)
? except:
? ? ? print('發(fā)生了異常')
捕獲特定的異常:當異常沒有發(fā)生時才進行處理的語句: else 后的語句塊時當異常沒有發(fā)生后才會執(zhí)行
while True:
? try:
? ? ? i = int(input('接收一個除數(shù):'))
? ? ? print(2 / i)
? except ZeroDivisionError:? # 只捕獲ZeroDivisionError異常
? ? ? print('發(fā)生了ZeroDivisionError異常')
? except (ValueError, KeyboardInterrupt, TypeError):? # 捕獲元組中的異常
? ? ? print('發(fā)生了ValueError或KeyboardInterrupt或TypeError異常')
? except:? # 可以捕獲所有異常
? ? ? print('發(fā)生了未知異常')
? else:
? ? ? print('結束程序運行')
? ? ? break
不管是否發(fā)生異常都進行處理的語句
finally 下的語句塊不管有沒有發(fā)生異常都會執(zhí)行
while True:
? try:
? ? ? i = int(input('接收一個除數(shù):'))
? ? ? print(2 / i)
? except:
? ? ? print('發(fā)生了異常')
? finally:
? ? ? print('執(zhí)行了finally語句塊')
5.拋出異常 raise
使用 raise 語句拋出一個指定的異常: raise 異常類型(‘異常描述’)
raise NameError('使用一個還未賦值對象的變量')
raise 唯一的一個參數(shù)是指定要被拋出的異常,它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)。
6.異常類列表
官方文檔https://docs.python.org/3.6/library/exceptions.html#exception-hierarchy
NoSuchElementException,程序告訴沒有這樣的元素。