Как вызвать метод, который выбрасывает исключение в блоке catch? - PullRequest
0 голосов
/ 15 февраля 2019

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

Проблема в том, что моя функция возвращает значение.Но если я использую HandleException в своем блоке перехвата, Java жалуется, что функция не возвращает значение, даже если моя исключительная ситуация HandleException всегда выдает исключение.

Какой хороший способ исправить это?Спасибо!

Вот пример кода.

public class MyException {

    static int foo(int num) throws Exception {
        try {
            return bar(num);
        } catch (Exception e) {
            handleException(); 
        //    throw new Exception("Exception in foo", e);
        }
    }

    static int bar(int num) throws IllegalArgumentException {
        if (num < 0) {
            throw new IllegalArgumentException("Num less than 0");
        }
        return num;
    }

    static void handleException(Exception e) throws Exception {
        System.err.println("Handling Exception: " + e);
        throw new Exception(e);
    }

    public static void main(String[] args) throws Exception {
        int value = foo(-1);
    }
}

В моем исходном классе у меня есть много методов, имеющих этот формат.

try {
    ...
} catch (Exception1) {
    Log exception
    throw appropriate exception
} catch (Exception2) {
    Log exception
    throw appropriate exception
}

Я пытаюсьпридумать более понятный способ написать блоки catch.

Ответы [ 3 ]

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

foo тип возврата метода int, а тип возврата handleException равен void, поэтому компилятор выдает ошибку.

(1) Здесь вы можетерешите это следующим образом:

Снова сгенерируйте исключение.

try{
      return bar(num);
}
catch(Exception e){
      handleException(e);
      throw e;
}

(2) Более того, если вы хотите выбросить новое созданное исключение, измените тип возвращаемого значения handleException до Exception.Используйте

throw handleException(e);
0 голосов
/ 15 февраля 2019

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

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

Рассмотрим метод: int foo(int num) throws Exception

Метод foo возвращает значение, перехватывает исключение / обрабатывает и также генерирует исключение.Рассмотрим эти аспекты.

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

Здесь необходимо рассмотреть два варианта:

  1. Повторно выдать исключение, как пользовательское исключение для бизнеса / приложения (просто зарегистрируйте его и повторнобросить то же самое или пользовательское исключение), которое необходимо обработать в другом месте - то есть в вызывающем методе вверх по стеку.
  2. Обработка исключения: это означает, что метод заботится об исключении.Некоторая бизнес / логика приложения происходит в обработке исключений.И метод возвращает значение.

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

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

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

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

Примечания (edit-add) :

  • Существует довольно многостатьи, которые объясняют об обработке исключений в бизнес-приложениях в сети.Можно попробовать строку поиска, такую ​​как «Лучшие практики Java исключения».Вот одна из таких статей, в которой есть некоторая полезная информация: Эффективные исключения Java .
  • Также необходимо учитывать конструкцию try-catch-finally (наряду с различными новыми функциями исключений познакомился с Java 7).
0 голосов
/ 15 февраля 2019

Это потому, что исключение, которое было сгенерировано в handleException, уже перехвачено блоком catch метода foo.Таким образом, метод foo больше не выдает исключение, заставляя блок catch ничего не возвращать.Поэтому, если метод bar генерирует исключение, он переходит в блок catch, но, поскольку блок catch не возвращает ничего, Java выполняет строки после блока catch, но когда он достигает конца, он выдает ошибку, что «метод должен вернутьрезультат типа int ", поскольку у вас нет оператора возврата.

Вы должны изменить эту часть.

public class MyException {

    static int foo(int num) throws Exception {
        try {
            return bar(num);
        } catch (Exception e) {
            throw handleException(e); // this will throw the exception from the handleException
        //    throw new Exception("Exception in foo", e);
        }
    }

    static int bar(int num) throws IllegalArgumentException {
        if (num < 0) {
            throw new IllegalArgumentException("Num less than 0");
        }
        return num;
    }

    // This method now returns an exception, instead of throwing an exception
    static Exception handleException(Exception e) {
        System.err.println("Handling Exception: " + e);
        return new Exception(e);
    }

    public static void main(String[] args) throws Exception {
        int value = foo(-1);
    }
}
...