2013-10-31 72 views
0

真正的Assert語句有什麼好處。我不明白爲什麼我需要使用它。我讀了近100條有關斷言陳述的問題/答案,但仍然不知道它有什麼好處。我認爲這個陳述有太多的衝突。Assert語句有什麼好處?

例如有人說:「不要在生產中使用它」,但有些人說「你可以在生產層面使用它們」。有些人說:「總是處理生產中的斷言錯誤」,但有些人說「從不處理生產或開發級別的斷言錯誤」。

這是爲什麼呢例如https://stackoverflow.com/a/2758262/1379734

+3

你的問題是一個意見問題;我認爲這是題外話。 –

+1

可能重複的[在Java斷言?​​](http://stackoverflow.com/questions/2758224/assertion-in-java) –

+4

你所看到的稱爲**「意見分歧」**。你需要閱讀這些論點並且自己決定哪一個你同意。再次重申意見不會有成果。 –

回答

1

爲什麼這會被認爲是不正確的?

public int pop() { 
    // precondition 
    assert !isEmpty() : "Stack is empty"; 
    return stack[--num]; 
} 

assert應該表達不變的條件。如果pop()是一個private方法,那麼您可能會認爲它應該只有纔會被檢查空堆棧的代碼調用。由於此方法爲public,因此您無法控制調用方可以執行哪些假設。在這種情況下,堆棧下溢應導致Exception

再次,assert是東西宣告必須是真實的,不是一件可能是真實的。 「可能」條件應通過其他運行時檢查強制執行,而不是在聲明中聲明。

是否啓用生產聲明受制於偏好。這樣做的理由是斷言不應該失敗,所以它們應該在生產中安全。反對這樣做的論點是表現懲罰(某些assert條件的計算可能很昂貴),以及投擲Error throwables的破壞性質。

0

的不正確使用你似乎是尋找簡單,它始終是一個好主意,或者它從來就不是一個好主意。不是這種情況。它有適用的情況下,它是有道理的,在有限的情況下,你想避免它們的性能,但這是非常罕見的。

有些人對你的斷言不瞭解甚多,但很樂意發表意見。我建議你得出你自己的結論,並在適合你的地方使用它。

的錯誤和異常的問題,我建議只處理這些地方

  • 你可以採取一些糾正措施
  • 您需要登錄錯誤以人可以看到它已經發生,並採取行動。

因此,我陷入Throwable在我的線程的最高級別(就在它死亡之前),並確保它被正確記錄。在所有其他情況下,我只會捕捉例外,我可以做一些有用的事情。

0

聲明需要開銷來處理。理論上講,如果他們通過測試,沒有理由在生產中重新運行它們。你的測試可能是不完整的,並且一個斷言可能會遇到一個在測試期間沒有解決的意外情況,但是希望日誌能夠讓你找出錯誤,而不需要運行斷言。