向任何java异常添加属性
我想通过添加一个属性来定制java异常类。它可以像以下属性一样简单:
boolean isThisStupid;
void setIsThisStupid(boolean iValue);
boolean getIsThisStupid();
每次我实例化一个异常,比如NullPointerException或IllegalArgumentException,它都会包含这个属性
由于我没有Java的源代码,我当然不能编辑异常基类
我考虑过使用decorator模式,使用一个实现IEException接口的“ExceptionCorator”类,但是,这样做会丢失我不想要的初始异常类型。例如:
IException mException = new ExceptionDecorator( new NullPointerException() );
我会得到:
mException instanceof ExceptionDecorator; //true
mException instanceof NullPointerException; //false
我希望我的自定义异常是NullPointerException的实例
这是完全通用的,我希望它能与Exception的任何子类一起工作
这可能吗?如果是,也许有一种模式可以帮助我,但我不知道
我已经尽了最大努力澄清,如果我不清楚,请询问更多细节,我将重新表述最初的主题
谢谢
# 1 楼答案
谢谢你们的回答,似乎没有什么能真正满足我的需要。所以我可能只是改变我的想法,而不是强迫别人做一些会让人尴尬、无法维护的事情
# 2 楼答案
要让exception类扩展NullPointer,请执行以下操作:
要让一个类与exception的任何子类一起工作,您必须按如下方式定义它:
如果这不是你想做的,请告诉我
# 3 楼答案
这在编译时是不可能的。要想做你想做的事情,你应该在运行时用Javasist动态创建你的异常类
否则,对于静态类型,可以使用decorator。装饰者必须使用与装饰对象相同的接口/类。它是装饰师的底座
在您的情况下,基类不能是您创建的新接口,因为您不能更改现有异常的代码。所以装饰器和装饰对象之间的共同抽象类是
Exception
你可以有一个这样的装饰师:
Decorator的理念是向装饰对象添加行为
在我的示例中,我修饰了
toString()
方法,用它的值显示新字段然后你可以提出这样一个例外:
# 4 楼答案
我认为这里最好的选择是继续使用您描述的decorator模式,而不是使用
instance of
,在异常类(#containsInstanceOf
或其他什么)中创建另一个方法,并在代码中使用它来检查包含的类型我认为添加您想要的行为的唯一方法是像Lombok那样处理字节码,或者创建代理对象。这两种模式都非常混乱,使用decorator模式处理
instance of
不起作用的事实可能更容易