W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
按照一般的學(xué)習(xí)思路,掌握了前兩節(jié)內(nèi)容,已經(jīng)足夠編程所需了。但是,我還想再多一步,還是因?yàn)楸窘坛痰淖x者是要from beginner to master。
>>> assert 1==1
>>> assert 1==0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
從上面的舉例中可以基本了解了assert的特點(diǎn)。
assert,翻譯過(guò)來(lái)是“斷言”之意。assert是一句等價(jià)于布爾真的判定,發(fā)生異常就意味著表達(dá)式為假。
assert的應(yīng)用情景就有點(diǎn)像漢語(yǔ)的意思一樣,當(dāng)程序運(yùn)行到某個(gè)節(jié)點(diǎn)的時(shí)候,就斷定某個(gè)變量的值必然是什么,或者對(duì)象必然擁有某個(gè)屬性等,簡(jiǎn)單說(shuō)就是斷定什么東西必然是什么,如果不是,就拋出錯(cuò)誤。
#!/usr/bin/env python
# coding=utf-8
class Account(object):
def __init__(self, number):
self.number = number
self.balance = 0
def deposit(self, amount):
assert amount > 0
self.balance += balance
def withdraw(self, amount):
assert amount > 0
if amount <= self.balance:
self.balance -= amount
else:
print "balance is not enough."
上面的程序中,deposit()和withdraw()方法的參數(shù)amount值必須是大于零的,這里就用斷言,如果不滿足條件就會(huì)報(bào)錯(cuò)。比如這樣來(lái)運(yùn)行:
if __name__ == "__main__":
a = Account(1000)
a.deposit(-10)
出現(xiàn)的結(jié)果是:
$ python 21801.py
Traceback (most recent call last):
File "21801.py", line 22, in <module>
a.deposit(-10)
File "21801.py", line 10, in deposit
assert amount > 0
AssertionError
這就是斷言assert的引用。什么是使用斷言的最佳時(shí)機(jī)?有文章做了總結(jié):
如果沒(méi)有特別的目的,斷言應(yīng)該用于如下情況:
(上述要點(diǎn)來(lái)自:Python 使用斷言的最佳時(shí)機(jī)?)
不論是否理解,可以先看看,請(qǐng)牢記,在具體開(kāi)發(fā)過(guò)程中,有時(shí)間就回來(lái)看看本教程,不斷加深對(duì)這些概念的理解,這也是master的成就之法。
最后,引用危機(jī)百科中對(duì)“異常處理”詞條的說(shuō)明,作為對(duì)“錯(cuò)誤和異?!辈糠值目偨Y(jié)(有所刪改):
異常處理,是編程語(yǔ)言或計(jì)算機(jī)硬件里的一種機(jī)制,用于處理軟件或信息系統(tǒng)中出現(xiàn)的異常狀況(即超出程序正常執(zhí)行流程的某些特殊條件)。
各種編程語(yǔ)言在處理異常方面具有非常顯著的不同點(diǎn)(錯(cuò)誤檢測(cè)與異常處理區(qū)別在于:錯(cuò)誤檢測(cè)是在正常的程序流中,處理不可預(yù)見(jiàn)問(wèn)題的代碼,例如一個(gè)調(diào)用操作未能成功結(jié)束)。某些編程語(yǔ)言有這樣的函數(shù):當(dāng)輸入存在非法數(shù)據(jù)時(shí)不能被安全地調(diào)用,或者返回值不能與異常進(jìn)行有效的區(qū)別。例如,C語(yǔ)言中的atoi函數(shù)(ASCII串到整數(shù)的轉(zhuǎn)換)在輸入非法時(shí)可以返回0。在這種情況下編程者需要另外進(jìn)行錯(cuò)誤檢測(cè)(可能通過(guò)某些輔助全局變量如C的errno),或進(jìn)行輸入檢驗(yàn)(如通過(guò)正則表達(dá)式),或者共同使用這兩種方法。
通過(guò)異常處理,我們可以對(duì)用戶在程序中的非法輸入進(jìn)行控制和提示,以防程序崩潰。
從進(jìn)程的視角,硬件中斷相當(dāng)于可恢復(fù)異常,雖然中斷一般與程序流本身無(wú)關(guān)。
從子程序編程者的視角,異常是很有用的一種機(jī)制,用于通知外界該子程序不能正常執(zhí)行。如輸入的數(shù)據(jù)無(wú)效(例如除數(shù)是0),或所需資源不可用(例如文件丟失)。如果系統(tǒng)沒(méi)有異常機(jī)制,則編程者需要用返回值來(lái)標(biāo)示發(fā)生了哪些錯(cuò)誤。
一段代碼是異常安全的,如果這段代碼運(yùn)行時(shí)的失敗不會(huì)產(chǎn)生有害后果,如內(nèi)存泄露、存儲(chǔ)數(shù)據(jù)混淆、或無(wú)效的輸出。
Python語(yǔ)言對(duì)異常處理機(jī)制是非常普遍深入的,所以想寫(xiě)出不含try, except的程序非常困難。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: