簡體   English   中英

拋出set方法的最佳例外

[英]Best exception to throw inside a set method

如果我有一個set方法,我想修改一些值,如果用戶輸入錯誤的值,這是拋出指示失敗的最佳例外?

public void setSomething(int d) throws ....
{
    if (d < 10 && d >= 0)
    {
        // ok do something
    }
    else throw new ... // throw some exception
}

我會去IllegalArgumentException

拋出以指示方法已被傳遞非法或不適當的參數。

編輯

另一個說明:

代替

if (conditionIsTrue) {
  doThis();
  doThat();
} else { 
  throw new IllegalArgumentException();
}

寫:

if (conditionNotTrue) {
    throw new IllegalArgumentException();
}

doThis();
doThat();

(雖然這個建議可能有爭議;-))。

我同意@Code Monkey關於創建自己的InvalidArgumentException,但他的實現沒有顯示它提供的所有優點。

1)您可以添加便捷方法來簡化參數檢查。 例如:

InvalidArgumentException.throwIfNullOrBlank(someString, "someString");

if (someString == null || someString.trim().isEmpty()) {
    throw new IllegalArgumentException("someString is null or blank");
}

2)您可以編寫確認哪個參數無效的單元測試。 如果拋出IllegalArgumentException,則單元測試無法確認是否因為您希望拋出它而拋出它。 你甚至不能說它是由你自己的代碼拋出的。

try {
    someClass.someMethod(someValue);
    Assert.fail("Should have thrown an InvalidArgumentException");
} catch (InvalidArgumentException e) {
    Assert.assertEquals("someValue", e.getArgumentName());
}

3)您可以在自己的代碼中告訴異常。 (這是一個沒有太多實際優勢的小問題)

如果該數字是索引,則可以使用IndexOutOfBoundsException 否則,正如Oliver所說, IllegalArgumentException

不要害怕創建IllegalArgumentException的子類來更准確地解決問題。 為IllegalArgumentException編寫的任何catch塊仍將捕獲它,但堆棧跟蹤將提供更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM