Обработка нескольких исключений в методе - PullRequest
2 голосов
/ 03 декабря 2009

В настоящее время я работаю над обслуживанием фрагмента кода, который немного "Исключительно счастлив". В принципе, когда-либо метод или что-нибудь бросает исключение. Я собираюсь позаботиться об этом, но в то же время мне интересно, как лучше обрабатывать отдельные исключения в меньшем блоке кода, например, в методе. Лучше сделать что-то вроде этого:

public void aMethod()
  try {
    //Lots of code in here.  Many lines.
  } catch(Exception e) {
    // TODO - Handle All Exceptions, but fairly generically
  }
}

Или как то так:

public void bMethod() {
  try {
    // One line of code.
  } catch(Exception e) {
    // TODO - Handle a specific Exception (may even involve rethrowing it with more information)
  }

  // More code.

  try {
    // Another line of code.
  } catch(Exception e) {
    // TODO - Handle another specific exception.
  }
}

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

Ответы [ 5 ]

6 голосов
/ 03 декабря 2009

Прежде всего, вы должны помещать код только в блоки try / catch, которые заслуживают исключений. Например, наличие неожиданного значения не обязательно является исключением, но попытка чтения из файла, который не существует, является.

Чтобы ответить на ваш главный вопрос, вы должны поместить исключаемый код в тот же блок try {} и перехватить конкретные вопросы в порядке детализации в нескольких блоках catch после основной попытки.

//Regular code that doesn't need to be covered by a try/catch block

try {

  //critical code only

} catch (NullPointerException npe) {
  //Code
} catch (RandomException re) {
  //code
} catch (Exception e) {
  //code
}
2 голосов
/ 03 декабря 2009

Ответ на ваш вопрос: это зависит.

  • если код в блоке try является последовательным, если нет смысла продолжать работу в случае ошибки, лучше использовать первый подход
  • если код предпринимает отдельные шаги, которые относительно не связаны (например, при разборе чисел) и могут быть восстановлены без прерывания остальной части метода, секунда в оценке имеет смысл

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

1 голос
/ 03 декабря 2009

ваш bMethod не очень полезная иллюстрация. Попробуйте переписать это. В любом случае, у вас есть два варианта:

  1. ловить исключения и регистрировать их.
  2. поймать исключения и throw new RuntimeException(ex) (перебросить исключение времени выполнения, указав в качестве причины оригинал)

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

0 голосов
/ 03 декабря 2009

В дополнение к уже внесенным предложениям вы также можете рассмотреть возможность извлечения блоков try / catch из «мяса» функции.

public void delete(Page page) {
    try {
        deletePageAndAllReferences(page);
    }
    catch (Exception e) {
        logError(e);
    }
}

private void deletePageAndAllReferences(Page page) throws Exception {
    deletePage(page);
    registry.deleteReference(page.name);
    configKeys.deleteKey(page.name.makeKey());
}

private void logError(Exception e) {
    logger.log(e.getMessage());
}

Это позволяет вам сосредоточить внимание на функции, которая вам действительно интересна, без обработки исключений на вашем пути.

0 голосов
/ 03 декабря 2009

Если блок try / catch не добавляет полезную информацию, просто позвольте методу вызвать исключение и обработать его, когда вызывающий может разумно что-то сделать с исключением. Это может значительно сократить количество попыток / поймать (на порядок).

Кстати, хитрость для отбрасывания любого исключения:

try {
   // do something
} catch (Throwable t) {
   Thread.currentThread().stop(t); // rethrow any exception.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...