作者NullLife (哀莫大於心死)
看板java
标题[问题] 一个关於自订Exception的问题
时间Thu Aug 1 15:09:35 2013
小弟我现在在某个大专案底下写单支的程式功能,上头会来呼叫我写的程式做事情,
那现在我想要自己自订一个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
1F:推 Killercat:catch exception的时候用qualified name 08/01 15:11
哇哇~感谢大大!!
原来要这样qualified name取用才会catch到,学到了~感恩<(_ _)>
2F:→ popcorny:看到晕了.. @@ 08/01 15:31
3F:推 PsMonkey:我觉得炸点在於... 你为什麽会觉得这是同一个 Kerker.... 08/01 15:31
後来才惊觉不是同一个>"<
4F:→ swpoker:为何kerkerException是放在interface里面阿??? 08/01 15:34
原本是想找最上层放, 就丢在那了
※ 编辑: NullLife 来自: 115.82.254.32 (08/01 15:40)
5F:→ swpoker:那就不一样了喔~当然你可以从名子去分~但是不同的class喔 08/01 15:52
嗯嗯,问题解决了~感谢各位<(_ _)>
※ 编辑: NullLife 来自: 115.82.254.32 (08/01 16:05)
对不起,我又有新的问题...
那这样我catch的时候,变成ToolClass要写一段catch, WorkClass也要写一段catch
可是我两段要做的事情是一样的耶,有办法写在一起处理吗?
※ 编辑: NullLife 来自: 115.82.254.32 (08/01 16:18)
6F:→ swpoker:你可以把两段的CODE放上来闻香一下吗 08/01 16:25
嗯,大致上是这样...
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)
7F:→ swpoker:catch (IOException|SQLException ex) (7) 08/01 17:06
8F:→ swpoker:那要用桥接吗?不然就是整理一下方法就可以了啦 XD 08/01 17:08
感谢,不过我刚要桥接时发现好像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)
9F:→ Killercat:er..不是一定得挂qualified name, 是要看你import 08/01 18:19