Если вы сохраняете информацию об исключениях Java в БД, какие части исключений следует сохранить, чтобы решить проблему без избыточности? - PullRequest
2 голосов
/ 12 июля 2011

Какие части объекта java.lang.Exception необходимо сохранить в базе данных, чтобы дать вам наилучшую возможность воссоздать проблему, которая привела к созданию исключения?

А какие части, если их сохранить вместе, создадут избыточную информацию?

Например, если вы сохраните результат вызова exception.getMessage(), а также сохраните exception.getCause().getMessage(), получится ли у вас дублирующаяся информация?

И, если вы сохраните exception.getMessage, будет ли излишним также сохранять выходные данные из exception.printStackTrace()?

Ответы [ 4 ]

2 голосов
/ 12 июля 2011

Моя стратегия заключается в том, чтобы сохранить временную метку и трассировку стека исключения.

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

1 голос
/ 12 июля 2011

Сохранение данных об ошибках в базе данных обычно служит только для дальнейшего анализа таких данных. С этой точки зрения, я рекомендую вам иметь определенную классификацию для ваших собственных исключений. Например, назначьте им некоторый код ошибки. Некоторый конкретный код ошибки должен быть посвящен неизвестным исключениям. Теперь вы сохраняете в базу данных код ошибки и (желательно в отдельном столбце) сообщение об исключении. Для неизвестных исключений я бы рассмотрел вызов toString(), который включал бы класс исключений и сообщение. Трассировка стека лучше относится к логу. Но чтобы его было легче найти, включите в базу данных некоторую информацию, такую ​​как идентификатор запроса, которая позволит легко найти в журнале трассировку стека.

0 голосов
/ 12 июля 2011

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

0 голосов
/ 12 июля 2011

Я думаю, вы должны сэкономить:

  • трассировка стека
  • сообщение
  • 1008 * Отметка времени *

printStackTrace является избыточным для getMessage. Посмотрите на код:

    public void printStackTrace(PrintWriter s) {
    synchronized (s) {
        s.println(this);
        StackTraceElement[] trace = getOurStackTrace();
        for (int i=0; i < trace.length; i++)
            s.println("\tat " + trace[i]);

        Throwable ourCause = getCause();
        if (ourCause != null)
            ourCause.printStackTraceAsCause(s, trace);
    }
}

public String toString() {
    String s = getClass().getName();
    String message = getLocalizedMessage();
    return (message != null) ? (s + ": " + message) : s;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...