[問題] 一個關於自訂Exception的問題
小弟我現在在某個大專案底下寫單支的程式功能,上頭會來呼叫我寫的程式做事情,
那現在我想要自己自訂一個Exception物件(以下我稱KerkerException)
當我在我自己這邊最上層catch到這個KerkerException的時候,
我就只getMessage()給user看到我想給他看的訊息,
若是catch其它Exception的時候,我想要顯示StackTrace,
因為若都將StackTrace都寫到LOG裡去,USER看到一大串就以為是程式爆炸了
但實際上我只是想要讓user看到簡單的一個訊息,告訴他可能你資料有錯誤或者參數下錯之類的。
那現在重點是我有一個共用的ToolClass,我也想利用這個方式處理
在我呼叫ToolClass裡的method做事情時,也會丟KerkerException出來,
最上層我就可以catch這個Exception來只顯示getMessage()的訊息。
先講一下我work的程式跟ToolClass所繼承的關係
WorkClass1 extends WorkClass_D implements WorkClass_E
WorkClass_D extends WorkClass_B implements WorkClass_C
WorkClass_E extends WorkClass_C
WorkClass_C extends WorkClass_A
寫成直向的話(我覺得這樣比較好看)
WorkClass1 extends WorkClass_D extends WorkClass_B
implements WorkClass_C extends WorkClass_A
implements WorkClass_E extends WorkClass_C extends WorkClass_A
(還有其它WorkClass2, WorkClass3, ...都是同樣的繼承模式)
ToolClass extends ToolClass_D implements ToolClass_E
ToolClass_D extends ToolClass_B implements ToolClass_C
ToolClass_E extends ToolClass_C
ToolClass_C extends ToolClass_A
ToolClass extends ToolClass_D extends ToolClass_B
implements ToolClass_C extends ToolClass_A
implements ToolClass_E extends ToolClass_C extends ToolClass_A
結尾的地方(A跟B)已經是專案底層固定的class,不是我這個層級能夠自己修改的了...
最一開始我是在WorkClass_C, ToolClass_C裡分別加上KerkerException,就像以下寫的
public interface WorkClass_C extends WorkClass_A {
@SuppressWarnings("serial")
class KerkerException extends RuntimeException {
public KerkerException(String message) {
super(message);
}
}
}
public interface ToolClass_C extends ToolClass_A {
@SuppressWarnings("serial")
class KerkerException extends RuntimeException {
public KerkerException(String message) {
super(message);
}
}
}
在WorkClass1, WorkClass2, ...跟ToolClass裡分別都認得KerkerException
但當我ToolClass在WorkClass1裡丟出KerkerException的時候,
會一直掉到WorkClass1的Exception裡,而不是catch到KerkerException...
後來才驚覺應該是兩個所認得的KerkerException根本不是同一個,
才想說再往上找有沒有繼承同樣的老爸,結果居然在不是我能修改的層級的地方...
所以我現在不知道怎麼讓WorkClass1, WorkClass2, ...
跟ToolClass能夠認得同一個KerkerException??
又或者是有什麼其它方法能夠達成我最初的目的?
希望有版大能提供我解答或方向,感恩。
--
所以想著昨天期待明天 我卻活在這兩者的中間
現實的問題那麼討厭 可是不得不面對
和平獎的禮物是金錢 領導運動獲得了地位 黃玠
矛與盾的故事不斷上演 到底什麼才是對 相片收集簿
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 115.82.254.32
推
08/01 15:11, , 1F
08/01 15:11, 1F
哇哇~感謝大大!!
原來要這樣qualified name取用才會catch到,學到了~感恩<(_ _)>
→
08/01 15:31, , 2F
08/01 15:31, 2F
推
08/01 15:31, , 3F
08/01 15:31, 3F
後來才驚覺不是同一個>"<
→
08/01 15:34, , 4F
08/01 15:34, 4F
原本是想找最上層放, 就丟在那了
※ 編輯: NullLife 來自: 115.82.254.32 (08/01 15:40)
→
08/01 15:52, , 5F
08/01 15:52, 5F
嗯嗯,問題解決了~感謝各位<(_ _)>
※ 編輯: NullLife 來自: 115.82.254.32 (08/01 16:05)
對不起,我又有新的問題...
那這樣我catch的時候,變成ToolClass要寫一段catch, WorkClass也要寫一段catch
可是我兩段要做的事情是一樣的耶,有辦法寫在一起處理嗎?
※ 編輯: NullLife 來自: 115.82.254.32 (08/01 16:18)
→
08/01 16:25, , 6F
08/01 16:25, 6F
嗯,大致上是這樣...
try {
process(); // 裡面有可能會有ToolClass丟出來的KerkerException
// 也有可能是WorkClass run到一半丟出來的KerkerException
} catch (WorkClass.KerkerException wke) {
wke.printStackTrace();
} catch (ToolClass.KerkerException tke) {
tke.printStackTrace();
}
我剛試了一下,因為WorkClass跟ToolClass的KerkerException不是同一個
所以我要這樣才不會漏掉其中一個,而掉到Exception裡
而他們的動作其實都一樣,所以我原本想找他們兩個有相同extend或implements的東西
寫在那邊一次解決了,很可惜沒有...
※ 編輯: NullLife 來自: 115.82.254.32 (08/01 16:38)
→
08/01 17:06, , 7F
08/01 17:06, 7F
→
08/01 17:08, , 8F
08/01 17:08, 8F
感謝,不過我剛要橋接時發現好像JRE1.7才支援這個寫法...?
但我剛發現一個寫法, 但我不確定是否會影響其他繼承的class
我在tool繼承支線裡發現一段很乾淨(目前是什麼都沒有XD)的interface繼承
原本打算寫在那邊, 然後work再去implements它
但想了想不太對, 既然一開始設定兩邊繼承支線就拆開了,
到後面我還把它綁在一起, 萬一後續tool那邊有要新實做什麼東西
是work那邊不需要做的事情, 好像有點麻煩...
於是我在那個interface裡又塞了一段interface,變成↓
public interface ToolClass_C extends ToolClass_Fathers {
interface OwnException {
@SuppressWarnings("serial")
public class KerkerException extends RuntimeException {
/**
* 自定錯誤訊息
* @param message message
*/
public KerkerException(String message) {
super(message);
}
}
}
}
然後work跟tool再去implements ToolClass_C.OwnException
這樣就變成會是同一個KerkerException
但我不曉得這樣寫, 對後續會不會照成影響?
因為不只有我負責的程式會去繼承這些東西,
所以我現在沒有很確定這樣寫到底OK不OK...?
※ 編輯: NullLife 來自: 115.82.254.32 (08/01 17:58)
→
08/01 18:19, , 9F
08/01 18:19, 9F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):