Java: не может перебросить исключение: необработанный тип исключения Исключение - PullRequest
11 голосов
/ 29 февраля 2012

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

У меня есть этот код:

public Boolean doJobWithResult() {
    boolean result = true;
    final Feed feed = Feed.findById(feedId);
    try {
        feed.fetchContents();
    } catch (Exception ex) {
        result = false;
        Logger.info("fetching feed(%d) failed", feedId);
        throw ex;
    }
    return result;
}

Но затмение жалуется на бросокНапример, он говорит «Необработанное исключение типа исключения» и предлагает добавить вокруг него блок try-catch.

На самом деле я хочу, чтобы процесс, вызывающий этот метод, обрабатывал исключение, а не обрабатывал его сам... Я просто хочу вернуть true, если все идет хорошо, и записать его, если есть исключение

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

есть идеи?

Ответы [ 9 ]

8 голосов
/ 29 февраля 2012

Ваш метод doJobWithResult должен объявить, что он может генерировать исключение:

public Boolean doJobWithResult() {

становится

public Boolean doJobWithResult() throws Exception {
5 голосов
/ 29 февраля 2012

Вы можете выдать то же исключение, если добавите throws Exception в сигнатуру вашего метода.В противном случае вы можете выдать RuntimeException .

public Boolean doJobWithResult() { 
    boolean result = true; 
    final Feed feed = Feed.findById(feedId); 
    try { 
        feed.fetchContents(); 
    } catch (Exception ex) { 
        result = false; 
        Logger.info("fetching feed(%d) failed", feedId); 
        throw new RuntimeException(ex); 
    } 
    return result; 
} 

. В таком случае вам не нужно указывать, что public Boolean doJobWithResult() что-то выбрасывает, но убедитесь, что вы правильно обработали его позже (поймать или ожидать, что ваш поток остановится ... это в конечном итоге RuntimeException).

4 голосов
/ 29 февраля 2012

Я думаю, здесь есть несколько вещей, о которых стоит упомянуть:

  1. Вы хотите, чтобы doJobWithResult() возвращало значение true в случае успеха и false в случае сбоя, либо ничего не возвращает в случае успеха и выдает исключение в случае сбоя. И то, и другое одновременно невозможно. В первом случае перехватите исключение, зарегистрируйте его и верните false, во втором случае измените свою подпись, чтобы она возвращала void, и выдавайте исключение и обрабатывайте его в вызывающей стороне.
  2. Это Не чтобы поймать исключение, записать его и сбросить. Зачем? Потому что потенциальный посетитель вашего метода не знает, что вы уже регистрируете его, и, возможно, также регистрирует его. Либо сгенерируйте исключение (в этом случае вызывающий должен иметь дело с ним), либо перехватите его и обработайте (зарегистрируйте его).
  3. Обратите внимание, что бросание Exception не дает вызывающей стороне вашего метода никакой подсказки о том, что потенциально может пойти не так в вашем методе, всегда лучше выбросить более конкретные исключения или обернуть исключение в определяемое пользователем, и свергни его.
  4. Более того, если вы бросите Exception, у вызывающей стороны может возникнуть соблазн перехватить Exception, не заметив, что это также перехватит каждое исключение RuntimeException (так как оно получено из Exception), что может быть нежелательным поведением.
3 голосов
/ 29 февраля 2012

Если doJobWithResult не должен обрабатывать исключение, удалите блок catch и добавьте «throws Exception» в сигнатуру метода. Регистрация исключений может быть выполнена в классе / методе, которые имеют дело с Исключением в соответствующем блоке try / catch.

2 голосов
/ 29 февраля 2012

Нет необходимости устанавливать результат как false в блоке catch, так как значение не будет возвращено (так как мы генерируем исключение).

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

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

2 голосов
/ 29 февраля 2012

Поскольку Exception - проверено , альтернатива отлову Exception - объявить ваш метод как выбрасывающий:

public Boolean doJobWithResult() throws Exception {
    // ...
}
1 голос
/ 29 февраля 2012

Я думаю, что способ обработки этого исключения действительно уместен, если какой-либо сбой метода feed.fetchContents () не может быть восстановлен. (Идея лучше остановить, чем продолжать) Кроме того, я бы предложил вам использовать более конкретную иерархию исключений.

И еще одна вещь, которую я получил из эффективной книги Java, - если вы пишете такой метод, вы должны документировать @throw (в комментариях) с указанием причины.

1 голос
/ 29 февраля 2012

Добавьте throws Exception к вашему методу. Вам также не нужно добавлять result = false; в ваш блок catch.

0 голосов
/ 29 февраля 2012

Вы можете выдать непроверенное исключение

 Logger.info("fetching feed(%d) failed", feedId);
 throw new RuntimeException(ex);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...