2013-03-09 42 views
2

我寫API,所以我的API將從外部模塊使用。這裏是我想不出用什麼斷言或java.lang.IllegalArgumentException斷言VS運行時異常

/** 
* Adds translation of information to underlying store for particular language 
* @param languageId The identifier of the language 
* @param translation The translation provided for the specific language 
* @throws AssertionError if the provided language id is {@code null} or empty 
*   or provided translation is {@code null} or empty 
*/ 
public final void addTranslation(String languageId, String translation){ 
    assert !(Strings.isNullOrEmpty(languageId)); 
    assert !(Strings.isNullOrEmpty(translation)); 

    translations.put(languageId, translation); 
} 

如果我使用運行時異常,我認爲這可能會損害其使用該API的應用程序的執行的方法之一。如果我使用斷言,那麼它會傷害我的API,如果斷言標誌被禁用。

也試過讀取類似的帖子When to use an assertion and when to use an exception。但是,檢測哪個案例是我的,這有點令人困惑。

有嚴格定義的方式,其中使用斷言何地使用運行時異常?

+1

[異常Vs的斷言]的可能的複製(http://stackoverflow.com/questions/1276308/exception-vs-assertion) – emlai 2015-12-20 10:32:48

回答

3

斷言通常是一個開發的技術,可以在生產中被關閉。 Java,Eiffel,C++和我知道使用它們的每種語言都是如此。

我個人更喜歡運行時異常執行合約。你不能關閉這些。

+0

是的,我已經改變了我的意見,可能是運行時異常是嚴格的,但是強制執行合同的正確方法。 – 2013-03-10 06:18:23

1

不要使用斷言爲您的API輸入數據的驗證。如果您的API使用不正確,則只需拋出運行時異常,例如IllegalArgumentException

0

斷言僅用於測試。對於其他的用途,應該使用異常,或者如果structores(第二個解決方案是優選的,因爲它比捕捉異常快得多)

-1

無論是斷言,也不例外應當用於實現業務邏輯。有一個簡單的原因:處理異常是非常緩慢的。想象一下,你的代碼經常被調用,然後處理不好的輸入,會花費太長時間。只需接受一個合同:在調用之前檢查變量並僅傳遞乾淨的參數或在方法開始時用if語句檢查變量。

UPD

斷言應該用來檢查一番不應該發生, 而異常應被用來檢查的東西可能 發生的這一點。

Using Assertions in Java

斷言拋出一個錯誤,而不是一個異常的,因爲他們的 目的是要你的程序崩潰。

Class Error

一個錯誤是Throwable的子類,表示嚴重的問題 合理的應用程序不應該試圖捕獲。大多數這樣的 錯誤都是異常情況。

Asse田是錯誤的子類

+0

檢查必須做外部模塊不是我,以及如果他們不想檢查? :) – 2013-03-10 04:55:44

+0

http://stackoverflow.com/a/1957662/2031799 - 我同意這個想法 – Mikhail 2013-03-10 05:41:32