Что включить в условие catch для исключения - PullRequest
3 голосов
/ 22 сентября 2010

У меня есть код, который выдает кучу исключений, но каждое из них содержит только метод printStackTrace (), как показано ниже

} catch (SecurityException e) {
    // TODO Auto-generated catch block
    System.err.println(e);
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Достаточно ли этого или мне нужно включить дополнительные операторы, такие как System.err.println (e)? Обычно, если возникает исключение, я могу отследить источник только с помощью приведенного выше.

Ответы [ 5 ]

8 голосов
/ 22 сентября 2010

Если есть что-то, что вы можете сделать, чтобы решить проблему, сделайте это в подвохе, если вы ничего не можете сделать, тогда лучше использовать каркас регистрации для регистрации исключения, чем дляиспользуйте e.printStackTrace(); или System.err.println(e);

Я лично рекомендую: http://www.slf4j.org/,, но если у вас есть мазохистские тенденции, вы можете попробовать очень плохой (но официальный) Java Logging API: http://download.oracle.com/javase/1.4.2/docs/guide/util/logging/,

Еще одним преимуществом SLF4J является то, что он может перенаправить свою регистрацию на ужасный Java Logging API (таким образом, вы можете использовать элегантно разработанный API и при этом соответствовать ужасно разработанному (де-юре не де-факто) »стандарту"

SLF4J прост в использовании, для регистрации исключения все, что вам нужно сделать, - написать logger.error("some accompanying message", exception);, еще одно из его преимуществ заключается в том, что вы можете, например, настроить его на , чтобы отправить вам электронное письмо каждый раз, когда ваше приложение падает (используя logback в качестве основного механизма ведения журнала)

1 голос
/ 22 сентября 2010

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

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

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

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

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

1 голос
/ 22 сентября 2010

Если вы хотите отследить источник, достаточно e.printStackTrace().Обычно я ставлю e.printStackTrace(); на уровне DEBUG.Также добавляю осмысленное сообщение об ошибке на уровне ERROR для пользователей.

1 голос
/ 22 сентября 2010

Зависит от исключений.Очевидно, что с printStackTrace () будет напечатано исключение для отладки (или пользователей, которые сообщат вам).Однако дополнительная обработка ошибок не выполняется.

Пример. Если выдается исключение IOException, может потребоваться показать пользователю сообщение об ошибке, указывающее точную причину ошибки, или вы можете сделать другую попытку, прозрачную дляпользователь.Или вы можете прервать всю программу, если операция имеет решающее значение для успеха всей задачи ... и т. Д.

0 голосов
/ 22 сентября 2010

Если вы можете позволить себе использовать фреймворк, например log4j , вы сможете звонить

}catch(Exception e){ log.error("Exception occurred:",e}

создание каркаса журнала для регистрации вашего настраиваемого сообщения «Возникла исключительная ситуация» с последующей трассировкой стека в файле журнала ошибок

...