Обработка исключений в Java - PullRequest
0 голосов
/ 22 марта 2011

Возможно ли, чтобы весь мой код try / catch перехватил исключение суперкласса, а затем какой-нибудь класс утилит выяснил, к какому типу относится исключение, чтобы я мог регистрировать определенный тип?Например:

CustomLog{
  Logger log= ....

  public static logTrace(Exception e){
    log.debug("name of exception: " + e.????);
  }

}

SomeOtherClass{

  try{

  }catch(Exception e){
    CustomLog.logTrace(e);
  }

}

Или есть лучшая идея, какова моя цель (иметь только общие исключения в коде)?

Ответы [ 4 ]

2 голосов
/ 22 марта 2011

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

log.error("Exception caught", e)

Большинство регистрация API поддержка a Throwable в качестве аргумента их debug(), error() и т. Д. методы. Не нужно изобретать велосипед, если у вас нет для этого реальной причины.

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

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

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

0 голосов
/ 22 марта 2011

Exception.toString() даст вам то, что вы хотите, я думаю.

0 голосов
/ 22 марта 2011

Пока у CustomLog есть доступ к специализированному классу Exception, тогда да.

Вы можете даже сделать что-то подобное в своем коде CustomLog:

logTrace(Exception ex) {
   try {
       throw ex;
   } catch(CustomException ex) {
       // specialized handling of CustomException
   } catch(Exception ex) {
       // unknown exception
   }
}
0 голосов
/ 22 марта 2011

Попробуйте:

e.getClass().getName()

Однако, если это исключение Wrappered, вы можете рассмотреть возможность регистрации его причины.

...