向任何java异常添加属性

向任何java异常添加属性,java,exception,decorator,Java,Exception,Decorator,我想通过添加一个属性来定制java异常类。它可以像以下属性一样简单: boolean isThisStupid; void setIsThisStupid(boolean iValue); boolean getIsThisStupid(); 每次我实例化一个异常,比如NullPointerException或IllegalArgumentException,它都会包含这个属性 由于我没有Java的源代码,我当然不能编辑异常基类 我考虑过使用decorator模式,使用一个实现IEExcep

我想通过添加一个属性来定制java异常类。它可以像以下属性一样简单:

boolean isThisStupid;

void setIsThisStupid(boolean iValue);
boolean getIsThisStupid();
每次我实例化一个异常,比如NullPointerException或IllegalArgumentException,它都会包含这个属性

由于我没有Java的源代码,我当然不能编辑异常基类

我考虑过使用decorator模式,使用一个实现IEException接口的“ExceptionDecorator”类,但是,这样做会丢失我不想要的初始异常类型。例如:

IException mException = new ExceptionDecorator( new NullPointerException() );
我会得到:

mException instanceof ExceptionDecorator; //true
mException instanceof NullPointerException; //false
我希望我的自定义异常是NullPointerException的实例

这是完全通用的,我希望它能与Exception的任何子类一起工作

这可能吗?如果是,也许有一种模式可以帮助我,但我不知道

我已经尽了最大努力澄清,如果我不清楚,请询问更多细节,我将重新表述最初的主题


感谢您让exception类扩展NullPointer,请执行以下操作:

public MyNewException extends NullPointerException
{
    /*define methods and variables*/
}
对于要与exception的任何子类一起工作的类,您必须按如下方式定义它:

public MyNewException extends Exception
{
    /*define stuff*/
}

如果这不是您想要做的,请告诉我。

我认为您最好继续使用您描述的装饰器模式,而不是使用
实例,在您的异常类中创建另一个方法(
#containsInstanceOf
或其他东西)并在代码中使用它来检查包含的类型

我认为添加您想要的行为的唯一方法是像Lombok那样处理字节码,或者通过创建代理对象。这两种模式都非常混乱,使用decorator模式处理
实例的
不起作用的事实可能更容易

我希望我的自定义异常是NullPointerException的实例

这在编译时是不可能的。要想做您想做的事情,您应该在运行时使用Javasist动态创建您的异常类

否则,对于静态类型,可以使用decorator。装饰器必须使用与装饰对象相同的接口/类。它是装饰师的基础。

在您的情况下,基类不能是您创建的新接口,因为您不能更改现有异常的代码。因此,装饰器和装饰对象之间的公共抽象类是
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;

谢谢你们的回答,似乎没有什么能真正满足我的需要。因此,我可能只是改变我的想法,而不是强迫做一些会变得笨拙和不可维护的事情

我曾经想到过这样的事情,但是无论如何,有没有办法让它与try{}catch{}一起工作呢?很好的结论:)