Sridevi Laks
Sridevi Laks

Reputation: 197

Access Java Exception Objects's detailed message

I am debugging my application, I have added exception.getMessage() in logger, but exception.getMessage() prints Null, but , when I debug I could see my Exception String in exception object's detailed message, how can I get the exception message that is coming as detailed message? Note - getMessage returns Null.

P.S - I am not using PrintStackTrace or stacktraceElement, my logger should return the string from exception.getmessage(), that is the requirement.


From comment:

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; 
}

Upvotes: 4

Views: 13345

Answers (5)

maasg
maasg

Reputation: 37435

From the discussion in the comments, it is my conclusion that the root cause of your problem is in the implementation of the DBException constructor or its hierarchy. For a valid reason or not, I think it's not calling the exception class hierarchy (e.g. super(reason);) and therefore, you are not getting the expected behaviour from the call to dbException.getMessage(). Note that a call to new Exception(anotherException) will always populate the field backing the getMessage() call in the base Throwable class through this call chain: (only relevant bits shown)

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

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

Check the implementation of DBException as the root cause of the problem discussed.

Upvotes: 0

Andrzej Doyle
Andrzej Doyle

Reputation: 103777

You are creating your exception object without any message (you're only specifying the chained exception):

DBException dbExe = new DBException(sqlExe); 

hence calling dbExe.getMessage() may (correctly) return null (with the details depending on what your constructor does in this situation). The reason you can see a message in the stacktrace, incidentally, is because the generation of the stacktrace recurses to the underlying exception, and sqlExe.getMessage() will be what you're seeing.

The solution is simply to provide a message as well as the underlying exception when constructing your exception. The general wisdom is that this should reflect the level at which the exception is thrown, so perhaps something like the following:

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

If your unspecified "requirement about the existing code flow" means that you need the actual database exception to be the message in dbExe, you could construct this like the following:

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

though on the whole that duplication of the message isn't very nice, and the former option is the more "correct" one.

Upvotes: 0

Andreas Dolk
Andreas Dolk

Reputation: 114757

That is pretty strange. The message that you see with debugging is usually created through Throwable#toString and that calls getLocalizedMessage() internally.

So if the exception does have a message, then it should be returned through getMessage() and be part of the toString() result.

An exception/throwable does not need to have a detailed message. Please double check, if you've created your exceptions with a message.


After making your code readable: your DBException is created without a message, so dbExe.getMessage() will return null. Either look the the cause or add a message while creating:

DBException dbExe = new DBException(sqlExe.toString(), sqlExe);// just an example

Upvotes: 0

oliholz
oliholz

Reputation: 7507

Try:

            switch (chTraceLevel) { 
                case Con.IN: 
                case Con.S: 
                    String msg = exSuperException.getCause().getMessage();
                    // LOG msg
            } 

Upvotes: 0

Giann
Giann

Reputation: 3192

You can print out the full stack trace:

 exception.printStackTrace();

Upvotes: 4

Related Questions