鍍金池/ 教程/ Python/ 錯(cuò)誤和異常 (3)
標(biāo)準(zhǔn)庫(kù) (4)
如何成為 Python 高手
標(biāo)準(zhǔn)庫(kù) (6)
標(biāo)準(zhǔn)庫(kù) (3)
類(lèi)(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習(xí)
列表(3)
從小工到專(zhuān)家
除法
錯(cuò)誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準(zhǔn)備
函數(shù)練習(xí)
標(biāo)準(zhǔn)庫(kù) (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫(xiě)一個(gè)簡(jiǎn)單的程序
將數(shù)據(jù)存入文件
語(yǔ)句(5)
SQLite 數(shù)據(jù)庫(kù)
集成開(kāi)發(fā)環(huán)境(IDE)
集合(1)
類(lèi)(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語(yǔ)句(4)
錯(cuò)誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標(biāo)準(zhǔn)庫(kù) (1)
生成器
mysql 數(shù)據(jù)庫(kù) (1)
第三方庫(kù)
實(shí)戰(zhàn)
運(yùn)算符
類(lèi)(3)
字典(2)
語(yǔ)句(1)
數(shù)和四則運(yùn)算
語(yǔ)句(2)
文件(2)
MySQL 數(shù)據(jù)庫(kù) (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫(kù) (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫(xiě)模塊
用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫(kù) (5)
函數(shù)(4)
類(lèi)(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級(jí)
字符串(3)
為計(jì)算做準(zhǔn)備
多態(tài)和封裝
類(lèi)(4)
迭代
語(yǔ)句(3)
錯(cuò)誤和異常 (3)
分析 Hello
Python 安裝
標(biāo)準(zhǔn)庫(kù) (2)
列表(2)
元組

錯(cuò)誤和異常 (3)

按照一般的學(xué)習(xí)思路,掌握了前兩節(jié)內(nèi)容,已經(jīng)足夠編程所需了。但是,我還想再多一步,還是因?yàn)楸窘坛痰淖x者是要 from beginner to master。

assert

>>> 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 值必須是大于零的,這里就用斷言,如果不滿(mǎn)足條件就會(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)該用于如下情況:

  • 防御性的編程
  • 運(yùn)行時(shí)對(duì)程序邏輯的檢測(cè)
  • 合約性檢查(比如前置條件,后置條件)
  • 程序中的常量
  • 檢查文檔

(上述要點(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ì)用戶(hù)在程序中的非法輸入進(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 的程序非常困難。


總目錄   |   上節(jié):錯(cuò)誤和異常(2)   |   下節(jié):編寫(xiě)模塊

如果你認(rèn)為有必要打賞我,請(qǐng)通過(guò)支付寶:qiwsir@126.com,不勝感激。

上一篇:編寫(xiě)模塊下一篇:特殊方法 (1)