標籤:des style blog http color io os 使用 java
Wiki:
In computer programming, an assertion is a predicate (a true–false statement) placed in a program to indicate that the developer thinks that the predicate is always true at that place. If an assertion evaluates to false at run-time, an assertion failure results, which typically causes execution to abort.
在程式設計中,斷言(assertion)是一種放在程式中的一階邏輯(如一個結果為真或是假的邏輯判斷式),目的是為了標示與驗證程式開發者預期的結果-當程式執行到斷言的位置時,對應的斷言應該為真。若斷言不會真時,程式會中止執行,並出現錯誤訊息。
Programmers can use assertions to help specify programs and to reason about program correctness. For example, a precondition—an assertion placed at the beginning of a section of code—determines the set of states under which the programmer expects the code to execute. A postcondition—placed at the end—describes the expected state at the end of execution.
程式設計者可以用斷言來標示程式,提供程式正確性的相關資訊。例如在一段程式前加入斷言(先驗條件),說明這段程式執行前預期的狀態。或在一段程式後加入斷言(後驗條件),說明這段程式執行後預期的結果。
In languages such as Eiffel, assertions form part of the design process; other languages, such as C and Java, use them only to check assumptions at runtime. In both cases, they can be checked for validity at runtime but can usually also be suppressed.
在開發Eiffel語言的程式時,斷言是設計過程中的一部份。像C語言或Java等程式語言,主要在執行期檢查斷言是否正確,也可以用靜態斷言的方式,在編譯期檢查斷言。不論是哪一種情形,都可以檢查斷言的有效性,也可以關閉斷言檢查的機能。
百度百科:
1、編程斷言:
編寫代碼時,我們總是會做出一些假設,斷言就是用於
在代碼中捕捉這些假設。斷言表示為一些
布林運算式,程式員相信在程式中的某個特定點該運算式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在
測試時啟用斷言而在部署時禁用斷言。同樣,程式投入運行後,終端使用者在遇到問題時可以重新啟用斷言。 使用斷言可以建立更穩定、品質更好且 不易於出錯的代碼。當需要在一個值為FALSE時中斷當前操作的話,可以使用斷言。
單元測試必須使用斷言(Junit/JunitX)。 除了
類型檢查和單元測試外,斷言還提供了一種確定各種特性是否在程式中得到維護的極好的方法。 使用斷言使我們向按
契約式設計更近了一步。
2、斷言特性:
前置條件斷言:代碼執行之前必須具備的特性
後置條件斷言:代碼執行之後必須具備的特性
前後不變斷言:代碼執行前後不能變化的特性
3、斷言方式:
- assert Expression1
- assert Expression1:Expression2
其中Expression1應該總是一個
布爾值,Expression2是宣告失敗時輸出的失敗訊息的
字串。如果 Expression1為假,則拋出一個 AssertionError,這是一個
錯誤,而不是一個異常,也就是說是一個不可控制異常(unchecked Exception),AssertionError由於是錯誤,所以可以不捕獲,但不推薦這樣做,因為那樣會使你的系統進入不穩定點。
4、用法:不用的情況: 1.不要使用斷言作為
公用方法的參數檢查,公用方法的參數永遠都要執行 2.Assert 陳述式
不可以有任何邊界效應,不要使用Assert 陳述式去修改變數和改變方法的傳回值用的情況: 1.可以在預計正常情況下
程式不會到達的地方放置斷言 :assert false 2.斷言可以用於
檢查傳遞給私人方法的參數。(對於公有方法,因為是提供給外部的介面,所以必須在方法中有相應的參數檢驗才能保證代碼的健壯性) 3.使用斷言測試方法執行的
前置條件和後置條件 4.使用斷言
檢查類的不變狀態,確保任何情況下,某個變數的狀態必須滿足。(如age屬性應大於0小於某個合適值)
補充:
使用斷言的幾個原則:
- 使用斷言捕捉不應該發生的非法情況。不要混淆非法情況與錯誤情況之間的區別,後者是必然存在的並且是一定要作出處理的。
- 使用斷言對函數的參數進行確認。
- 在編寫函數時,要進行反覆的考查,並且自問:“我打算做哪些假定?”一旦確定了的假定,就要使用斷言對假定進行檢查。
- 一般教科書都鼓勵程式員們進行防錯性的程式設計,但要記住這種編程風格會隱瞞錯誤。當進行防錯性編程時,如果“不可能發生”的事情的確發生了,則要使用斷言進行警示。
程式一般分為
Debug 版本和Release 版本,Debug 版本用於內部調試,Release 版本發行給使用者使用。
斷言assert 是僅在Debug 版本起作用的宏,它用於檢查“不應該”發生的情況。
Usage:
assert宏的原型定義在
assert.h中,其作用是如果它的條件返回錯誤,則終止程式執行.
assert()
是一個診斷宏,用於動態辨識程式的邏輯錯誤條件。其原型是:
1 #include "assert.h" 2 void assert( int expression );
如果宏的參數求值結果為非零值,則不做任何操作(no action);如果是零值,用寬字元列印診斷訊息,然後調用abort()
。診斷訊息包括:
- 源檔案名稱字(在
stdlib.h
中聲明的宏__FILE__
的值)
- 所在的源檔案的行號(在
stdlib.h
中聲明的宏__LINE__
的值)
- 所在的函數名(在stdlib.h中聲明的宏
__func__
的值),這是C99新增的特性
- 求值結果為0的運算式
診斷資訊的顯示目標依賴於被調用程式的類型。如果是控制台程式,診斷資訊顯示在stderr裝置;如果是基於視窗的程式,assert()
產生一個Windows MessageBox來顯示診斷資訊。
使用assert的缺點是,頻繁的調用會極大的影響程式的效能,增加額外的開銷。
在調試結束後,可以通過在包含#include 的語句之前插入 #define NDEBUG 來禁用assert調用,範例程式碼如下:
1 #include 2 #define NDEBUG 3 #include
Assertion (software development) -- 斷言