我有许多类型异常,它们都具有相同的特征:它们拥有一个始终为非零的状态(int)字段。代码通常检查状态变量,如果非零,则抛出相应的异常(取决于上下文)。即:
if (status != 0) throw new AStatusException(status);
... // other context
if (status != 0) throw new BStatusException(status);
... // other context
if (status != 0) throw new CStatusException(status);
大多数情况下,我认为我可能会在基类throwIfNotZero
的静态方法StatusException
中实现此常用功能,并且各种A, B, CStatusException
类都继承该类。这有希望允许我编写这样的代码:
AStatusException.throwIfNonZero(status);
... // other context
BStatusException.throwIfNonZero(status);
... // other context
CStatusException.throwIfNonZero(status);
可悲的是,我得到的最接近的是我在帖子末尾附加的代码,这不是很令人满意。有没有更好的方法来做到这一点,也许没有使用Reflection和/或避免传递看似多余的类实例的要求(参见'用法')?
import java.lang.reflect.InvocationTargetException;
public class StatusException extends Exception {
public int status;
public StatusException (int status) {
this.status = status;
}
public static <T extends StatusException> void raiseIfNotZero(Class<T> klass, int code) throws T{
try {
if (code != 0) throw klass.getConstructor(Integer.TYPE).newInstance(code);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
AStatusException.raiseIfNotZero(AStatusException.class, status);
BStatusException.raiseIfNotZero(BStatusException.class, status);
答案 0 :(得分:1)
您可以在超类StatusException中重载函数raiseIfNotZero()。
并像这样称呼它
StatusException.raiseIfNotZero(AStatusException.class, status);
StatusException.raiseIfNotZero(BStatusException.class, status);
答案 1 :(得分:0)
public static int final STATUS_EXCEPTION_A=1;
public static int final STATUS_EXCEPTION_A=2;
raiseIfNotZero(int type, int status)
{
switch(type)
{ case STATUS_EXCEPTION_A: throw new AStatusException(); break;
case STATUS_EXCEPTION_B: throw new BStatusException(); break;
...
}
}