将异常从子类传递到超类

时间:2013-01-09 13:28:50

标签: java exception inheritance

有以下问题:

我有一个带有方法“call”的抽象类,它基本上调用了一些otherMethod,如果otherMethod抛出异常,我会尝试通过重新调用并再次调用“call”方法来修复catch。

public Object call(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
    while (true) {
        try {
            return callMethod(methodName, parameters, parameterTypes);
        } catch (SomeException e) {
            if (numberOfTriesLeft-- == 0) {
                throw new RetryingException();
            }
            login();
        }
    }
}

现在我有一个带有overriden方法调用的类的子类,可以使用null参数。基本上如果发生这种情况我想从超类调用该方法,但是不会抛出上面提到的异常,因此,没有重试和方法结束在其他地方失败。有没有办法手动抛出它并通过进一步或任何其他方式来修复它?谢谢你的帮助!

@Override
public Object call(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
    if (parameters[0] == null){
        // What to do here if I want to throw SomeException here to end up in a catch block from the call method in the superclass? Or how to change it
    }
    // Everything ok. No null params
    ...
    return super.call(methodName, parameters, parameterTypes);
}

1 个答案:

答案 0 :(得分:1)

根据我的经验,你能做的就是拥有这样的父方法:

public final Object call(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
    try {
        callMethod(methodName, parameters, parameterTypes)
    } catch (Exception ex) {
        // Handle any exception here...
    }
}

protected Object callMethod(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
    // .. your code
}

然后改为覆盖callMethod(子)方法:

@Override
protected Object callMethod(String methodName, Object[] parameters, Class[] parameterTypes) throws RetryingException, RemoteException {
    // Exception thrown here will now be caught!
    return super.callMethod(methodName, parameters, parameterTypes);
}

因此,这将接口方法与可重写方法分开。我在现有的API中看到了这种模式。

有些观点:

  • call现在final阻止它被覆盖。
  • callMethodprotected,使其只能覆盖并可从同一个程序包中调用 - 将其从公共API中删除。

更新:采取@Fildor提供的点。