Обработка исключений в программах Java - PullRequest
0 голосов
/ 12 февраля 2019

Это моя структура программы:

основная функция -> вызов класса A obj -> вызов класса A класса B obj

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

В настоящее время я делаю то, что мне кажется громоздким (и, вероятно, глупым):

-> Обработка исключений в функциях класса A и класса B.

-> Функция выхода со значением, которое считается «ошибочным» (например, конкретное значение или логическое значение «ложь»), если в функции произошло исключение.

-> main имеет свой собственный метод try / catch, но также для каждого вызова функции класса A и класса B, если он возвращает «error», он генерирует исключение и затем завершается с кодом ошибки.

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

какие-либо более понятные предложения?Это для программ, которые будут скомпилированы для запуска в качестве исполняемого JAR из командной строки и не будут микросервисными (или основанными на веб-сервере) - для них, я считаю, что вместо выхода из программы вы должны сообщить об ошибке в журналеи продолжить).

Ответы [ 5 ]

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

Вообще говоря, перехватывать и перебрасывать исключение стоит только в том случае, если:

  • вы собираетесь выбросить другой тип исключения (тот, который лучше соответствуетабстракция, которую обеспечивает метод, часто оборачивая исходное исключение), и / или
  • вам нужен какой-то побочный эффект (например, регистрация ошибки где-либо, или некоторая очистка, которая не помещается в finally { }блок).

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

И, как уже говорили другие, возврат выделенного кода ошибки редко бывает хорошей идеей в Java;они многословны, их легко забыть, и они не распространяются на звонящего.И возвращение специального значения (например, null) вместо нормального возвращаемого значения еще хуже!Исключения являются стандартным способом, и это то, что все будут ожидать.

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

Особенность исключений в Java заключается в том, что они делают много разных вещей, семантически

  1. Ошибки в коде: Исключения, такие как NullPointerException или SQLExceptions, где ваш SQL неправильный.Эти (IMO) не должны быть перехвачены или должны быть переброшены как Ошибки и перехвачены в uncaughtExceptionHandler (который вы можете определить в Thread)

  2. Ошибки пользователя: исключения, такие как NumberFormatException и исключения наневерные данные, когда пользователь ввел недопустимые значения.Это (IMO) должно быть обработано на месте с сообщением, рядом с которым они должны исправить значение

  3. Нормальные, ожидаемые исключения: Исключения, такие как IOException / SocketException.InterruptedException тоже в этой семье.Эти исключения являются вашими друзьями (!), Так как они разблокируют потоки, ожидающие чего-то, чего они должны ждать больше.Они являются частью нормального цикла подключения к ресурсам ввода-вывода.Поэтому, если сокет закрывается, вы можете записать исключение где-нибудь (иногда даже в этом нет необходимости) и, возможно, спросить пользователя, не хотят ли они снова открыть соединение.

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

ИМХО либо используйте исключения или код ошибки в качестве возвращаемого значения и будьте совместимы с этим подходом.

В kotlin вы можете использовать мощные библиотеки как Arrow-kt , который предлагает вам несколько сложных типов дляобрабатывать ошибки, такие как Попробуйте или Либо для обработки соответственно исключений и кодов ошибок или состояний.

Отказ от ответственности : я не связан сСтрелка команды

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

Основная идея, которой вы должны следовать, - это использовать метод main, подобный следующему:

public static void main(String... args) {
    try {
        new A().run();
    } catch (ExitProgramException e) {
        System.exit(e.getCode());
    }
}

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

public final class ExitProgramException extends RuntimeException {

    private final int code;

    public ExitProgramException(int code) { this.code = code; }

    public int getCode() { return code; }
}

Теперь в классах A и B вы можете throw new ExitProgramException(1), и все будет работать как положено.

Из-за extends RuntimeException промежуточному коду не нужно знать об этом исключении, и он с радостью пропустит его из класса B над классом A обратно в метод main, где он, наконец, перехватывается и преобразуется в код выхода.

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

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

На самом деле вас интересует, как сообщать о состоянии ошибки в командную строку.Таким образом, для класса A и класса B используйте стандартное исключение.Тем не менее, в методе main вы можете выйти ненормально для некоторых исключений или даже для всех исключений.Пожалуйста, проверьте Как именно работает код завершения приложения Java метода main ()? для получения более подробной информации.

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