2013-03-09 40 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