4

(参考这篇文章:如何从枚举构造函数中抛出异常?

我真的很想做同样的事情。示例代码:

public enum PublicIPWebservice {
    AMAZON_WEB_SERVICES("http://checkip.amazonaws.com"),
    EX_IP("http://api-ams01.exip.org/?call=ip"),
    WHAT_IS_MY_IP("http://automation.whatismyip.com/n09230945.asp");

private URL url;

private PublicIPWebservice(String url) throws MalformedURLException {
    this.url = new URL(url);
}

public URL getURL() {
    return url;
}
}

如果 url 不正确,程序应该会崩溃,因为这将是一个编程错误,所以在构造函数中捕获异常是错误的,不是吗?

解决该问题的最佳方法是什么?

4

4 回答 4

7

您可以捕获它并作为 AssertionError 重新抛出:

try {
    this.url = new URL(url);
}
catch(MalformedURLException e) {
    throw new AssertionError(e);
}
于 2012-12-21T19:28:32.240 回答
2

我会抛出RuntimeExpcetion某种(例如IllegalArgumentException

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException e) {
        throw new IllegalArgumentException(e);
    }
}
于 2012-12-21T19:28:45.000 回答
1

通常,程序员错误必须报告为未经检查的异常,因为它“不会发生”,因此无需强迫自己在客户端类中捕获异常。

也就是说,您应该包装 url 创建并抛出未经检查的异常。

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException ex) {
        throw new IllegalArgumentException("From input: " + url);
    }
}

抛出 IllegalArgumentException 是一个不错的选择。

于 2012-12-21T19:33:53.443 回答
0

你为什么不想捕捉那个异常?

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException e) {
        // surely you should handle the exception here
    }
}

这个枚举的第一个用户将如何处理异常。它当然不会期待一个。

于 2012-12-21T19:28:01.610 回答