2011-01-31 45 views
9

對意外情況的斷言被認爲是良好的防禦性編碼實踐。每當我想到可能會發生意想不到的事情時,我碰巧發出斷言,但現在看來對我來說是一種矯枉過正。何處放置斷言?

此外,有時並不一定會導致崩潰的輕微意外情況甚至可能導致客戶端失敗。

是否有強硬的規則來提出斷言?

謝謝。

回答

0

如果您確信某些條件必須是真的,然後才能轉到代碼的下一個級別,則會放置斷言。例如,當窗口句柄無效或某些變量不具有有效值時。

0

從它的聲音中,您將它們保留在發佈版本中。如果是這樣,則創建斷言級別 - 這些斷言將在特定版本中啓用或禁用。那麼只需使用斷言級別即可。

這樣,您不需要關閉,關閉或刪除它們以進行開發和調試構建或測試版發佈。

我通常禁用他們在發佈,但他們消耗大量的書面代碼。我認爲它不好 - 它用作文檔並強制按照預期使用界面。我認爲擁有許多開發人員可能會考慮太多的斷言是很好的,但是由於代碼庫不斷髮展並且確保程序總是按照預期使用,所以實際上並不是太多。因此,我不建議刪除它們,只是禁用發佈版本的非致命檢查。

最終,有比水平更好的方法(參見下面的討論,並從別人的回答中採取你想要的) - 但是水平是一種簡單的方法來引入變化而不會顯着影響現有程序。這對於轉換到另一個錯誤處理方案是一個很好的方法,或者如果你對已有的東西滿意度高於98%。

+2

我曾經在斷言級別上思考,但當在測試中發現的錯誤未被捕獲時,這是非常令人驚訝的。此外,我發現開發人員通常不知道哪個級別適用,並根據他們的心情或多或少地選擇...... –

+0

@Matthieu偉大的觀點 - 使用指定的致命條件處理程序(以及警報或日誌消息)並在必要時禁用生產聲明。當然,這取決於OP的致命錯誤條件的比例以及現有代碼是如何實現的。我的代碼在任何可能的情況下都是免費的 - 錯誤代碼/狀態只是在檢測到或遇到時被推送給調用者。但是重寫現有程序可能相當麻煩,所以我建議將級別作爲不會對現有代碼造成太大影響的解決方案。 – justin

2

不,沒有......但我肯定會建議在測試和生產中對斷言進行不同的處理。

在測試環境中,生成核心轉儲是完全可以的。它可以通過很好地安全地保持程序的整個狀態來輕鬆檢查觸發斷言的條件。

但是在生產環境中,您絕對不想崩潰(除非內存損壞...)。用戶期望系統總是響應,沒有什麼比請求某些東西更惱人的東西,從來沒有收到響應。因此,確保用戶獲得更有意義的響應是您的工作,即使它是錯誤消息。達到此目的的最簡單方法通常是拋出異常。

5

在哪裏放置斷言?

常常被忽視的是斷言也可以作爲文檔輔助。

所以,不僅要測試'意外',還要用它們來表示你的代碼中關鍵點的假設(不變量)。像assert(high >= low)

當然,讓他們有條件的,正如其他人在這裏指出的。

+0

+1不變量。 – murrekatt

6

之間時使用的斷言和異常的主要區別:

  • 使用斷言捕捉編程錯誤。如果代碼已被正確寫入,斷言絕不應該發生。

  • 使用異常捕獲意外環境導致的運行時錯誤。

  • 如果您的程序從文件讀取腳本或內容並且與預期格式不匹配,我認爲這是運行時狀況,因此是例外。

你可以決定,爲了調試的目的,在一個異常簡單的拋出,以便能夠更容易地計算出它得到拋出的地方使用斷言,雖然你可以使用插入異常宏FILELINE進入消息也要這樣做。

+1

+1,用於明確區分斷言和例外 – davka