Будет ли отброшено исключение, если попытка catch уже присутствует только с определенной целью? - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть следующий java-метод в отношении бросков исключений

public void wrapException(String input) throws MyBusinessException {

        // do something   

}

MyBusinessException расширяет класс Exception и возвращает любое (каждое) исключение вызывающей стороне.Я сомневаюсь,

Представьте, что мой код теперь изменен, чтобы обрабатывать одно конкретное исключение особым образом, как показано ниже.

public void wrapException(String input) throws MyBusinessException {
    try {
        // do something
    } catch (NumberFormatException e) {
        throw new MyBusinessException("there was a number error", e);
    }
}

Будет ли сгенерировать в сигнатуре метода по-прежнему возвращать вызывающему исключение любое исключение, кроме NumberFormatException, или мне придется изменить методы следующим образом?

public void wrapException(String input) throws MyBusinessException {
    try {
        // do something
    } catch (NumberFormatException e) {
        throw new MyBusinessException("there was a number error", e);
    }
    catch(Exception e) {
     throws MyBusinessException(e.message());
}
}

Цените любую проницательность.

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

В вашем первом решении он будет просто перехватывать исключения с типом NumberFormatException и любым классом, который наследует его.

public void wrapException(String input) throws MyBusinessException {
    try {
        // do something
    } catch (NumberFormatException e) {
        throw new MyBusinessException("there was a number error", e);
    }
}

Однако в вашем последующем решении, поскольку в вашем методе catch(Exception e)body, ваш метод будет перехватывать все исключения, которые наследуются от класса Exception, включая ваш собственный MyBusinessException.Следовательно, вам не нужно ставить throws MyBusinessException в сигнатуру метода.

public void wrapException(String input) throws MyBusinessException {
    try {
        // do something
    } catch (NumberFormatException e) {
        throw new MyBusinessException("there was a number error", e);
    }
    catch(Exception e) {
     throws MyBusinessException(e.message());
}
}

Этого достаточно;

public void wrapException(String input) {
        try {
            // do something
        } catch (NumberFormatException e) {
            throw new MyBusinessException("there was a number error", e);
        }
        catch(Exception e) {
         throws MyBusinessException(e.message());
    }
    }
0 голосов
/ 09 февраля 2019

Прежде всего, нам нужно понять, что «throws в сигнатуре метода по-прежнему возвращают любое исключение»Это объявление требуется только в том случае, если сам метод не хочет обрабатывать исключительный сценарий, а исключением является «Проверено».т. е. в случае «проверенного» исключения компилятор заставит вас либо обработать его (с помощью catch), либо объявить исключение с помощью ключевого слова throws.Если мы объявим это с помощью throws, то то же самое применение будет применимо для метода вызывающего.Когда какое-либо исключение выдается в методе, и исключение не перехватывается в этом методе, который всегда выдается методу вызывающего.то есть

int divideByZero(int n){
 return n/0;
}

сгенерирует исключение ArithmeticException, даже если мы не объявили его с помощью throws.(Поскольку это «Не проверено» означает, что Компилятор не применяет правила объявления или перехвата исключений «Не проверено».)

Таким образом, в вашем случае второй улов не обязателен, а является выбором.

0 голосов
/ 09 февраля 2019

catch (NumberFormatException e) будет ловить только NumberFormatException и любой его подкласс.Например, он не будет ловить IllegalArgumentException.

Если вы хотите обрабатывать другие типы исключений, вам придется явно их перехватывать.

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