Доступ к подробному сообщению Java Exception Objects - PullRequest
3 голосов
/ 28 июня 2011

Я отлаживаю свое приложение, я добавил exception.getMessage() в логгер, но exception.getMessage() печатает Null, но, когда я отлаживаюсь, я могу видеть строку исключения в подробном сообщении объекта исключения, как я могу получить исключение сообщение, которое приходит как подробное сообщение? Примечание - getMessage возвращает Null.

P.S. Я не использую PrintStackTrace или stacktraceElement, мой регистратор должен возвращать строку из exception.getmessage (), это требование.


Из комментария:

DBException dbExe = new DBException(sqlExe); 
DBException objDbEx = (DBException) ExceptionUtil.populateSuperException(dbExe, strTraceMesg, ConstantsIF.SEVERE_LEVEL, false, null, null, null); 
throw objDbEx;

public static SuperException populateSuperException (SuperException exSuperException, String strTraceMsg, char chTraceLevel, ) {
  if (strTraceMsg != null) { 
    switch (chTraceLevel) { 
      case Con.IN: 
      case Con.S: 
         //log
    } 
  } 
  return exSuperException; 
}

Ответы [ 5 ]

4 голосов
/ 28 июня 2011

Вы можете распечатать полную трассировку стека:

 exception.printStackTrace();
0 голосов
/ 28 июня 2011

Из обсуждения в комментариях я пришел к выводу, что коренная причина вашей проблемы заключается в реализации конструктора DBException или его иерархии.По уважительной причине или нет, я думаю, что это не вызывает иерархию классов исключений (например, super(reason);), и, следовательно, вы не получаете ожидаемого поведения от вызова к dbException.getMessage().Обратите внимание, что вызов new Exception(anotherException) всегда будет заполнять поле, поддерживающее вызов getMessage() в базовом классе Throwable через эту цепочку вызовов: (показаны только соответствующие биты)

public Throwable(Throwable cause) { 
    ... 
    detailMessage = (cause==null ? null : cause.toString());
     ... 
} 
public String toString() { 
    ... 
    String message = getLocalizedMessage(); 
    ...
} 

public String getLocalizedMessage() { 
    return getMessage();
}

Проверка реализации DBException как основная причина обсуждаемой проблемы.

0 голосов
/ 28 июня 2011

Вы создаете объект исключения без каких-либо сообщений (вы указываете только связанное исключение):

DBException dbExe = new DBException(sqlExe); 

следовательно, вызов dbExe.getMessage() может (правильно) вернуть null (детали зависят от того, что ваш конструктор делает в этой ситуации). Причина, по которой вы можете увидеть сообщение в трассировке стека, заключается в том, что генерация трассировки стека повторяется до основного исключения, и sqlExe.getMessage() будет тем, что вы видите.

Решение - просто предоставить сообщение, а также основное исключение при создании вашего исключения. Общая мудрость заключается в том, что это должно отражать уровень, на котором генерируется исключение, поэтому, возможно, что-то вроде следующего:

DBException dbExe = new DBException("Unable to persist widgets", sqlExe);

Если ваше неуказанное «требование о существующем потоке кода» означает, что вам нужно, чтобы фактическое исключение базы данных было сообщением в dbExe, вы можете сконструировать это следующим образом:

DBException dbExe = new DBException(sqlExe.getMessage(), sqlExe); 

хотя в целом это дублирование сообщения не очень приятно, и первый вариант является более «правильным».

0 голосов
/ 28 июня 2011

Это довольно странно. Сообщение, которое вы видите при отладке, обычно создается через Throwable#toString и вызывает getLocalizedMessage() внутри.

То есть , если у исключения есть сообщение, , то оно должно быть возвращено через getMessage() и будет частью результата toString().

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


После того как ваш код станет читабельным: ваш DBException будет создан без сообщения , поэтому dbExe.getMessage() вернет null. Либо посмотрите на причину , либо добавьте сообщение при создании:

DBException dbExe = new DBException(sqlExe.toString(), sqlExe);// just an example
0 голосов
/ 28 июня 2011

Попробуйте:

            switch (chTraceLevel) { 
                case Con.IN: 
                case Con.S: 
                    String msg = exSuperException.getCause().getMessage();
                    // LOG msg
            } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...