Обрабатывать исключение или генерировать исключение в Java - PullRequest
2 голосов
/ 04 августа 2010

Как такой фрагмент кода Java:

public void func() throws XXXException {    // throw exception to outer body ------ (2)
    try {
        ......
    } catch(XXXException ex) {
        // handle exception ------ (1)
    }
}

В таком состоянии, как вы решите выбрать (1) или (2)? Существуют ли какие-либо принципы обработки исключений в Java?

Ответы [ 6 ]

2 голосов
/ 04 августа 2010

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

Например, если "func" - это сетевой код низкого уровня, он, вероятно, должен вызвать исключение, а не перехватить его. Код, который ультимативно перехватывает его, должен отображать сообщение об ошибке пользователю (или тому, что еще имеет смысл). Если вместо этого «func» является частью уровня GUI, он, вероятно, перехватит исключение и отобразит сообщение об ошибке пользователю (или тому, что еще имеет смысл).

1 голос
/ 04 августа 2010

Если вы можете справиться с этим, вы справитесь.Например, если вы загружаете файл свойств и получаете FileNotFoundException, возможно, вы можете использовать некоторые свойства по умолчанию.В этом случае вы обрабатываете исключение.

Если вы не можете справиться с этим, но думаете, что кто-то еще может пойти дальше, вам следует выбросить исключение.Например, возможно, вы пишете общую утилиту для чтения в файлах свойств.В этом случае вы можете перебросить исключение, чтобы тот, кто использует вашу общую утилиту, мог затем продолжить и загрузить значения по умолчанию.

Если вы не можете справиться с этим и не хотите вводить сложность бросанияисключение, то вы должны отправить исключение в службу обработки исключений, которую вы можете настроить во время выполнения.Таким образом, при модульном тестировании служба обработки исключений может принять это исключение и выбросить его как исключение времени выполнения, что немедленно приведет к аварийному завершению теста.Однако в рабочем коде служба обработки исключений может просто зарегистрировать исключение и попытаться как-то перезапустить программу.

0 голосов
/ 04 августа 2010

Исключения представляют условия ошибки.Когда возникает ошибка, некоторый метод в цепочке вызовов знает , как обрабатывать эту ошибку в контексте приложения , т. Е. Что делать - игнорировать, повторять, прерывать и т. Д. Еслиэто этот метод, который знает, как обрабатывать это исключение, тогда вы обрабатываете его здесь.Если нет, вы бросаете его так, чтобы метод на один уровень вверх по цепочке вызовов принимал его и воздействовал на него.

Иногда вам может потребоваться выполнить как (1), так и (2).Вы можете обработать исключение, выполнить некоторую промежуточную обработку и затем перебросить его.

public void func() throws XXXException {
    try {
        ......
    } catch(XXXException ex) {
        logger.log(ex);
        throw ex;
    }
}

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

public void func() throws YYYException {
    try {
        ......
    } catch(XXXException ex) {
        throw new YYYException(ex);
    }
}

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

0 голосов
/ 04 августа 2010

На java-сайте O'Reilly есть отличная статья на эту тему. В нем подробно рассказывается о том, когда вы должны ловить против броска, а также о других вещах, таких как проверенные и непроверенные исключения.

0 голосов
/ 04 августа 2010

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

0 голосов
/ 04 августа 2010

Вы выбираете (1), если хотите что-то сделать с исключением (например, зарегистрировать его, извлечь из него информацию).Также обычно выдается исключение в блоке catch после того, как с ним покончено (т.е. throw ex;)

Вы выбираете (2), если хотите, чтобы пользователи вашего метода обрабатывали его (например, )Метод Java String.matches )

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