如何在不使用“ throws XXXException”的情况下处理“未处理的异常”

我有一个任务需要处理“未处理的异常”而不使用“引发XXXException”。情况如下:

如果它抛出JMSException,我需要重试一个方法。

public void retry(int retryCount) throws MessageGatewayException, JMSException {
    restartConnection(); //
}
public void restartConnection() throws JMSException {
    init(); //this is where JMSException is thrown
}

在我的send方法上,我调用retry()。

public void send(int retryCount) throws MessageGatewayException {
    //exit method if retried enough times.
    if(retryCount > someNumber)
        throw new IllegalArgumentException();
    try {
        producer.send();
    }
    catch (JMSException e) {
        retry(retryCount); // this is where Unhandled Exception is.
    }
}

我想做的是从send()调用retry()时,如果restartConnection()失败并抛出JMSException,我希望retry()调用send(retryCount ++)。我不想在send()方法上添加JMSException,但是它说我需要实现它。有没有办法处理异常,所以send()上没有JMSException?

评论
  • 贪婪的想念
    贪婪的想念 回复

    因此,我找到了解决此问题的方法,但是我不确定这是正常的事情。这是我所做的:

    public void send(int retryCount) throws MessageGatewayException {
        //exit method if retried enough times.
        if(retryCount > someNumber)
            throw new IllegalArgumentException();
        try {
            producer.send();
        }
        catch (JMSException e) {
            try {
                retry(retryCount); // this is where Unhandled Exception is
            }
            catch (JMSException ex) {
                send(++retryCount);
            }
        }
    }
    

    所以我基本上是在catch块中使用另一个try / catch块。这确实消除了错误,并且工作正常,但是我不确定这是要走的路。

  • 有夫之夫
    有夫之夫 回复

    You could call the method with retryCount+1 but when you reach, for example 10, raise the exception to avoid infinite error

    Handle it in send

    public void send(int retryCount) throws MessageGatewayException {
        //exit method if retried enough times.
        if(retryCount > someNumber)
            throw new IllegalArgumentException();
        try {
            producer.send();
        }
        catch (JMSException e) {
            try {
                retry(retryCount); // this is where Unhandled Exception is
            }catch (JMSException ex) {
                if(retryCount < 10)
                    send(retryCount+1);
                else
                    throw e;
            }
        }
    }
    

    Handle it in retry:

    public void retry(int retryCount) throws MessageGatewayException, JMSException {
        try{
            restartConnection(); //
        }catch (JMSException e) {
            if(retryCount < 10)
                retry(retryCount+1);
            else
                throw e;
        }
    }