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

2018-02-24 15:48 更新

按照一般的學(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,翻譯過來是“斷言”之意。assert是一句等價(jià)于布爾真的判定,發(fā)生異常就意味著表達(dá)式為假。

assert的應(yīng)用情景就有點(diǎn)像漢語的意思一樣,當(dāng)程序運(yùn)行到某個(gè)節(jié)點(diǎn)的時(shí)候,就斷定某個(gè)變量的值必然是什么,或者對(duì)象必然擁有某個(gè)屬性等,簡單說就是斷定什么東西必然是什么,如果不是,就拋出錯(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ò)。比如這樣來運(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é):

如果沒有特別的目的,斷言應(yīng)該用于如下情況:

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

(上述要點(diǎn)來自:Python 使用斷言的最佳時(shí)機(jī)?)

不論是否理解,可以先看看,請(qǐng)牢記,在具體開發(fā)過程中,有時(shí)間就回來看看本教程,不斷加深對(duì)這些概念的理解,這也是master的成就之法。

最后,引用危機(jī)百科中對(duì)“異常處理”詞條的說明,作為對(duì)“錯(cuò)誤和異?!辈糠值目偨Y(jié)(有所刪改):

異常處理,是編程語言或計(jì)算機(jī)硬件里的一種機(jī)制,用于處理軟件或信息系統(tǒng)中出現(xiàn)的異常狀況(即超出程序正常執(zhí)行流程的某些特殊條件)。

各種編程語言在處理異常方面具有非常顯著的不同點(diǎn)(錯(cuò)誤檢測與異常處理區(qū)別在于:錯(cuò)誤檢測是在正常的程序流中,處理不可預(yù)見問題的代碼,例如一個(gè)調(diào)用操作未能成功結(jié)束)。某些編程語言有這樣的函數(shù):當(dāng)輸入存在非法數(shù)據(jù)時(shí)不能被安全地調(diào)用,或者返回值不能與異常進(jìn)行有效的區(qū)別。例如,C語言中的atoi函數(shù)(ASCII串到整數(shù)的轉(zhuǎn)換)在輸入非法時(shí)可以返回0。在這種情況下編程者需要另外進(jìn)行錯(cuò)誤檢測(可能通過某些輔助全局變量如C的errno),或進(jìn)行輸入檢驗(yàn)(如通過正則表達(dá)式),或者共同使用這兩種方法。

通過異常處理,我們可以對(duì)用戶在程序中的非法輸入進(jìn)行控制和提示,以防程序崩潰。

從進(jìn)程的視角,硬件中斷相當(dāng)于可恢復(fù)異常,雖然中斷一般與程序流本身無關(guān)。

從子程序編程者的視角,異常是很有用的一種機(jī)制,用于通知外界該子程序不能正常執(zhí)行。如輸入的數(shù)據(jù)無效(例如除數(shù)是0),或所需資源不可用(例如文件丟失)。如果系統(tǒng)沒有異常機(jī)制,則編程者需要用返回值來標(biāo)示發(fā)生了哪些錯(cuò)誤。

一段代碼是異常安全的,如果這段代碼運(yùn)行時(shí)的失敗不會(huì)產(chǎn)生有害后果,如內(nèi)存泄露、存儲(chǔ)數(shù)據(jù)混淆、或無效的輸出。

Python語言對(duì)異常處理機(jī)制是非常普遍深入的,所以想寫出不含try, except的程序非常困難。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)