[英]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.