對於斷言 ASSERT 的理解

2021-06-20 19:27:44 字數 1248 閱讀 9603

昨天看了《**大全》的「防禦式程式設計」章節,解惑了長期以來自己對於斷言的理解。

書中給了使用斷言的指導意見,如下

用錯誤處理**來處理預期會發生的狀況,用斷言來處理絕不應該發生的狀況。

避免把需要執行的**放到斷言中

用斷言來註解並驗證前條件和後條件

對於高健壯性的**,應該先使用斷言再處理錯誤

其中有一段話,很清晰地說出了斷言的典型使用情況:

對**於內部系統的可靠的資料使用斷言,而不要對外部不可靠的資料使用斷言,對於外部不可靠資料,應該使用錯誤處理**。斷言可以看成可執行的注釋。

系統外部的資料(使用者輸入,檔案,網路讀取等等)都是不可信的,需要嚴格檢查(通常是錯誤處理)才能放行到系統內部,這相當於乙個守衛。而對於系統內部的互動(比如子程式呼叫),如果每次也都去處理輸入的資料,也就相當於系統沒有可信的邊界了,會讓**變的臃腫複雜;而事實上,在系統內部,傳遞給子程式預期的恰當資料應該是呼叫者的責任,系統內的呼叫者應該確保傳遞給子程式的資料是恰當可以正常工作的。這樣一來,就隔離了不可靠的外部環境和可靠的系統內部環境,降低複雜度。

但是在開發階段,**極可能包含缺陷,也許是處理外部資料的程式考慮的不夠周全,也許是呼叫系統內部子程式的**存在錯誤,造成子程式呼叫失敗。這個時候,斷言就可以發揮作用,用來確診到底是那部分出現了問題而導致子程式呼叫失敗。在清理了所有缺陷之後,內外有別的信用體系就建立起來。等到發行版時候,這些斷言就應該沒有存在必要。

附乙個c++可以用的自定義斷言

assert_ex.h1 23

4567

89

1011

1213

1415

1617

1819

#ifndef _assert_ex_h

#define _assert_ex_h

#include

#include

#ifdef _debug

#define _assert(exp, message)      \

}

#else

#define _assert(exp, message)

#endif

#endif //_assert_ex_h

斷言assert總結

0.python的assert是用來檢查乙個條件,如果它為真,就不做任何事。如果它為假,則會丟擲asserterror並且包含錯誤資訊。assert語句是一種插入除錯斷點到程式的一種便捷的方式。1.使用斷言可以建立更穩定,品質更好且不易於出錯的 當需要在乙個值為false時中斷當前操作的話,可以使用...

assert(斷言)用法

斷言語句是將除錯斷言插入到程式中的一種方便方法。1.用法 assert condition讓程式來測試condition,如果condition為false就會生成乙個assertionerror。相當於 if not condition raise assertionerror 2.示例 asse...

斷言(assert) 學習

在我學習程式設計時,我一直認為斷言 assert 是個報錯函式,事實上,它居然是個巨集,並且作用並非 報錯 在經過對其進行一定了解之後,對其作用及用法有了一定的了解,斷言assert是定義在assert.h中的 巨集 只在debug版本起作用,而在release版本不起作用。用法 assert 表示...