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