访问Java异常对象的详细消息

时间:2011-06-28 08:30:32

标签: java exception-handling

我正在调试我的应用程序,我在记录器中添加了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 个答案:

答案 0 :(得分:4)

您可以打印出完整的堆栈跟踪:

 exception.printStackTrace();

答案 1 :(得分:0)

尝试:

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

答案 2 :(得分:0)

这很奇怪。您通过调试看到的消息通常是通过Throwable#toString创建的,并在内部调用getLocalizedMessage()

所以如果异常确实有消息,那么然后它应该通过getMessage() 返回,而是{的一部分{1}}结果。

异常/ throwable不需要有详细的消息。如果您已通过消息创建了例外,请仔细检查。


使您的代码可读后:toString()已创建而没有消息,因此DBException将返回dbExe.getMessage()。在创建时查看原因或添加消息:

null

答案 3 :(得分:0)

您正在创建没有任何消息的异常对象(您只是指定了链接异常):

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

虽然总的来说消息的重复不是很好,而前一个选项更“正确”。

答案 4 :(得分:0)

根据评论中的讨论,我的结论是,问题的根本原因在于DBException构造函数或其层次结构的实现。由于有效的原因,我认为它不会调用异常类层次结构(例如super(reason);),因此,您没有从调用dbException.getMessage()获得预期的行为。请注意,对new Exception(anotherException)的调用将始终填充通过此调用链支持基本Throwable类中的getMessage()调用的字段:(仅显示相关位)

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

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

检查DBException的实现是所讨论问题的根本原因。