java: генерируется исключение журнала - PullRequest
0 голосов
/ 04 октября 2009

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

try
{
    doRiskyThing();
}
catch(Throwable t)
{
    log.warn("too bad");
    throw t;
}

Проблема в том, что теперь мой метод должен объявить, что он бросает throwable.

С другой стороны, если я регистрирую исключение в блоке finally, как я узнаю, какое исключение выдается (и если любое исключение выдается вообще).

Ответы [ 5 ]

4 голосов
/ 04 октября 2009

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

try{
    ..
}catch(RuntimeException e){
   log(e);
   throw e;
}catch(ExceptionException ..){
   log(e);
   throw e;
}

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

Предварительная обработка исключений - это функция, которая была удалена из монеты проекта в JDK 7.

0 голосов
/ 04 октября 2009

Catching Throwable сам по себе является уже плохой практикой (и отмечается как таковой многими инструментами проверки качества кода). Обернуть его в RuntimeException и снова выбросить? Ужасно! Весь смысл наличия иерархии исключений подрывается этим.

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

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

0 голосов
/ 04 октября 2009

Это должно работать:

try
{
    doRiskyThing();
}
catch(RuntimeException e)
{
    log.warn("too bad");
    throw e;
}
catch(Exception e)
{
    log.warn("too bad");
    throw new RuntimeException(e);
}
catch(Error e)
{
    log.warn("too bad");
    throw e;
}

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

0 голосов
/ 04 октября 2009

Вы можете войти в Throwable и создать исключение RuntimeException.

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

try
{
    doRiskyThing();
}
catch(Throwable t)
{
    log.warn("too bad, exception thrown: " + t.getMessage());
    throw new RuntimeException("Throwable exception was thrown, message: " + t.getMessage());
}

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

0 голосов
/ 04 октября 2009

Это неправильное место для записи исключения. Либо войдите в него с помощью doRiskyThing () при его создании, либо зарегистрируйте его там, где предполагается его захват.

...