向任何java异常添加属性

时间:2016-12-19 21:19:54

标签: java exception decorator

我想通过向它们添加属性来自定义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的任何子类。

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

我已尽力明确表示,如果我不这样做,请询问更多详情,我会重新说明最初的主题。

由于

4 个答案:

答案 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无法工作的事实可能更容易。