2010-10-16 59 views
1
final class DBGlobalsException extends Exception 
{ 
   String mistake; 

   //where this is shorthand for chained constructors that look like Exception 
   DBGlobalsException(String message, Throwable cause) 
   { 
     super(message,cause); 
   } 

   // elaborate your exception with whatever error state you want to propagate outwards 
   void setField(mistake) { 

    } 
} 

catch (IOException ex) { 
   DBGlobals.Error("OHMjson.Graph.saveLastGraphName - Error: " + ex.getMessage()); 
   msg = "Unable to save data"; 
   status = false; 
   DBGlobalsException dbe = new DBGlobalsException(msg,ex); 
   dbe.setField(status); 
   throw dbe; 
} 

處理這個職位代碼是從我以前的帖子採取...自定義異常在Java中

https://stackoverflow.com/users/recent/454848

請糾正我,如果我錯了......

  1. 是什麼setField方法呢?我們需要一個嗎?
  2. 扔dbe會拋出我的期望和消息被追加。
  3. 鏈式結構是什麼意思,就像有多個構造函數一樣。
+0

的描述我想你錯過了一些我張貼反對這個代碼前面的評論......你不*需要*'setField()'明確,我只是包括,要指向嵌入的方式無論您需要處理它的「Exception」中的狀態/錯誤狀態。建議你看看我留在我的答案早前問題的意見... – andersoj 2010-10-16 22:49:39

+0

閱讀有關此鏈接Exception'的'細節:http://download.oracle.com/javase/6/docs/api/java/lang /Throwable.html – andersoj 2010-10-16 22:56:21

回答

1

1)setField方法做了什麼? 我們需要一個。

setField()方法是我在previous question中介紹的一種方法,向您展示如何將新狀態添加到異常。由於我不知道應用程序的具體情況,因此我不知道需要傳播哪些特定信息。在這裏,它可能足以知道在封面下出了什麼問題,並且應該將IOException或其他任何東西作爲自定義異常中的「原因」。

2)throw dbe會給我帶來期待和被附加的信息。

是的,throw dbe拋出新的鏈接異常。如果你沒有看到它,是的,來自兩者的消息將被附加到結果堆棧跟蹤中。如Throwable API中所述,您可以自定義如何顯示/組成「消息」。

3)鏈式結構是什麼意思,是否有多個構造函數。

正如在另一個答案中指出的那樣,鏈式構造函數只是指調用其他構造函數的構造函數。在Throwable子類的情況,但是,也有爲了提供給連鎖例外,它給你一個標準的機制來「包裝」外例外,更適合您的代碼的抽象層次,底層異常具體的超類的構造函數。看到Throwable API

+0

setField方法的好處被使用,並且將我扔DBE拋出此setField方法值太.. – John 2010-10-16 23:23:06

+0

@約翰:不知道如果我正確地分析您的評論,但我給它一個去:的好處將狀態添加到自定義異常 - 即添加自定義字段並允許您使用setField()來設置 - 可以將狀態/錯誤信息傳播到外部作用域以捕獲異常。這避免了需要通過其他方式明確地傳遞錯誤或狀態。是的,如果您在'dbe'實例上調用'setField(something)',那麼捕獲異常的代碼將能夠看到它 - 您可能需要爲此添加一個'DBGlobalsException.getField()'方法。 – andersoj 2010-10-16 23:33:18

1

鏈式構造函數意味着您有一個構造函數,它接受您可能發送的所有「可能」參數,而其他所有構造函數都會簡單地調用(鏈)到這個參數。它們通常爲某些參數提供默認值。 所有邏輯都需要在主/鏈接構造函數中完成,因此代碼不會重複。

public class Movie { 
    private String title; 
    private String rating; 

    public Movie() { 
    this("G"); // calls-chains -- to main defualt constructor - note the default value passed 
    } 
    public Movie(String newRating) { 
    rating = newRating; 
    } 
} 

至於錯誤 - 如果setfield接受字符串值並設置錯誤字符串,那麼是的,這是必要的。如果消息與錯誤字符串是一樣的,那麼不是,你可以通過構造函數設置它。

1
  1. 看來你只貼實際的代碼,從它不可能說什麼setField做的部分。它可能只是設置了mistake字段,並且假設有類似的getField方法,則可以在需要時在別處檢索它。

  2. throw dbe;正如它所說的那樣:它會拋出dbe對象,它隱含地包含消息和類中聲明的任何其他字段。

  3. 通過構造函數鏈接,你指的是super(message,cause); 行嗎?如果是這樣,那隻需調用超類(Exception)的構造函數。基本上,構造函數沒有什麼特別的,所以它只是將其參數轉發給超類。


編輯:從什麼@andersoj在評論中提及,似乎他真正的意思在以前的答案是「異常鏈」,這是無關的一般構造。異常鏈接基本上可以讓你將異常鏈接到導致它的另一個異常。在您的示例中,響應IOException引發DBGlobalsException,因此在創建dbe時,通過將ex作爲cause自變量進行響應,您設置了一條鏈接,指出「ex導致dbe」。當您稍後捕獲dbe時,可以使用getCause()獲取鏈接的例外,即ex

+0

的鏈接在這裏發生異常的「特殊」的鏈接行爲,這樣的基本條件不丟失(我是約翰的早期的崗位提出的觀點)的優勢,如果傳播出來顯示在堆棧跟蹤,並可以使用'getCause()'方法或任何其他方法... – andersoj 2010-10-16 22:52:31

+0

@andersoj:我明白你的意思;這更恰當地稱爲「異常鏈接」,這與「構造鏈接」完全無關。 – casablanca 2010-10-16 22:59:27