我想通过向它们添加属性来自定义java异常类。它可以像以下属性一样简单:
boolean isThisStupid;
void setIsThisStupid(boolean iValue);
boolean getIsThisStupid();
每次我实例化一个异常,比如NullPointerException或IllegalArgumentException,它都会包含这个属性。
由于我没有Java的源代码,我当然不能编辑Exception基类。
我考虑使用装饰模式,使用" ExceptionDecorator"实现IException接口的类,但是,这样做会丢失我不想要的初始异常类型。例如:
IException mException = new ExceptionDecorator( new NullPointerException() );
我会得到:
mException instanceof ExceptionDecorator; //true
mException instanceof NullPointerException; //false
我希望我的自定义异常是NullPointerException的一个实例。
这是完全通用的,我希望这可以使用Exception的任何子类。
这甚至可能吗?如果是的话,也许有一种模式可以帮助我,我不知道?
我已尽力明确表示,如果我不这样做,请询问更多详情,我会重新说明最初的主题。
由于
答案 0 :(得分:1)
我希望我的自定义异常是NullPointerException的一个实例。
在编译时不可能。要做你想做的事,你应该在运行时使用Javasist动态创建你的异常类。
否则,对于静态类型,您可以使用装饰器。装饰器必须使用与装饰对象相同的接口/类。它是装饰者的基础。
在您的情况下,基类不能是您创建的新接口,因为您无法更改现有异常的代码。因此,装饰器和装饰对象之间的公共抽象类是Exception
。
你可以有这样的装饰者:
public class DecoratorException extends Exception{
private Exception decorated;
private boolean isStupid;
public DecoratorException(Exception exception){
this.decorated = exception;
}
public void setStupid(boolean iValue){
// TODO
}
public boolean getStupid{}{
// TODO
}
// get effective exception
public Exception getEffectiveException(){
return decorated;
}
// decorate the method you wish
// for example toString()
public String toString(){
return decorated.toString() + ", isStupid=" + isStupid);
}
}
Decorator的想法是在装饰对象中添加行为
在我的示例中,我修饰了toString()
方法以显示具有其值的新字段。
然后你可以提出这样的例外:
Exception e = new DecoratorException(new IllegalArgumentException());
e.setStupid(true);
throw e;
答案 1 :(得分:1)
感谢大家的回答,似乎没有什么能真正满足我的需求。所以我可能只是改变我的想法,而不是强迫某些事情变得尴尬而且难以维持
答案 2 :(得分:0)
要获取扩展NullPointer的异常类,请执行以下操作:
public MyNewException extends NullPointerException
{
/*define methods and variables*/
}
对于使用任何子类异常的类,您必须按如下方式定义它:
public MyNewException extends Exception
{
/*define stuff*/
}
如果这不是您想要做的事,请告诉我。
答案 3 :(得分:0)
我认为你最好的选择是继续使用装饰模式,如你所述,而不是使用instance of
,在你的异常类(#containsInstanceOf
或其他东西)中创建另一个方法并使用在您的代码中检查包含的类型。
我认为添加所需行为的唯一方法是像Lombok那样搞乱字节代码,或者创建代理对象。这两个都非常混乱,只是使用装饰模式并处理instance of
无法工作的事实可能更容易。