Как обработать «необработанное исключение» без использования «throws XXXException» - PullRequest
1 голос
/ 24 апреля 2020

У меня есть задача, где мне нужно обработать «необработанное исключение» без использования «throws XXXException». Вот ситуация:

Мне нужно повторить метод, если он вызывает JMSException.

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

, и в моем методе отправки я вызываю 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.
    }
}

То, что я хочу сделать, это когда retry () вызывается из send (), и если restartConnection () завершается неудачно и выдает JMSException, я хочу, чтобы retry () вызывал send (retryCount ++). Я не хочу добавлять JMSException в метод send (), но он говорит, что мне нужно это реализовать. Есть ли способ обработать исключение, чтобы у меня не было JMSException при send ()?

Ответы [ 3 ]

2 голосов
/ 24 апреля 2020

Вы можете вызвать метод с помощью retryCount+1, но при достижении, например, 10, вызвать исключение, чтобы избежать бесконечной ошибки

Обработать его в 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
                logger.error(e); // or print or whatever
        }
    }
}

Обращайтесь в retry:

public void retry(int retryCount) throws MessageGatewayException{
    try{
        restartConnection(); //
    }catch (JMSException e) {
        if(retryCount < 10)
            retry(retryCount+1);
        else
            logger.error(e); // or print or whatever
    }
}
1 голос
/ 24 апреля 2020

Похоже, желательно сохранять логи повторных попыток c, содержащиеся в методе retry. Предполагается, что исходный параметр retryCount для send является «максимальным числом попыток попытки».

public void retry(int retryCount) throws MessageGatewayException {

    while (retryCount-- > 0 && !restartConnection());

}

И добавьте логический результат к restartConnection:

public boolean restartConnection() {
    try {
        init(); 
        return true;
    } catch (JMSException e) {
       return false;
    }
}

Ваш метод send в этом примере не изменился.

1 голос
/ 24 апреля 2020

Итак, я нашел способ справиться с этим, но я не уверен, что это нормально. Вот что я сделал:

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);
        }
    }
}

Так что я в основном использую другой блок try / catch внутри моего блока catch. Это устраняет ошибку и работает нормально, но я не уверен, что это путь к go.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...