簡體   English   中英

如何從枚舉構造函數中拋出異常

[英]How to throw an exception from an enum constructor

(參考這篇文章:如何從枚舉構造函數中拋出異常?

我真的很想做同樣的事情。 示例代碼:

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 不正確,程序應該會崩潰,因為這將是一個編程錯誤,所以在構造函數中捕獲異常是錯誤的,不是嗎?

解決該問題的最佳方法是什么?

您可以捕獲它並重新拋出AssertionError:

try {
    this.url = new URL(url);
}
catch(MalformedURLException e) {
    throw new AssertionError(e);
}

我會拋出某種RuntimeExpcetion (例如IllegalArgumentException

private PublicIPWebservice(String url) {
    try {
        this.url = new URL(url);
    catch (MalformedURLException e) {
        throw new IllegalArgumentException(e);
    }
}

通常程序員錯誤必須報告為未經檢查的異常,因為它“不會發生”所以不需要強迫自己捕獲客戶端類中的異常。

那說你應該包裝url創建並拋出一個未經檢查的異常。

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

拋出IllegalArgumentException是一個不錯的選擇。

為什么你不想要趕上例外?

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

這個枚舉的第一個用戶與異常有什么關系。 IT當然不會期待一個。

如果您真的希望程序“崩潰”(終止), System.exit(n)是(我認為)唯一的絕對保證,沒有人會處理一些異常。

暫無
暫無

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

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