【问题标题】:Access Java Exception Objects's detailed message访问 Java Exception Objects 的详细信息
【发布时间】:2011-06-28 08:30:32
【问题描述】:

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

【问题讨论】:

  • 显示一些代码(围绕异常链)。如果你包装你的异常并且包装的异常没有保留消息,那么你会得到一个空值。
  • 是的,我包装了异常,但我返回了相同的对象。请看下面的代码。
  • exception.getCause().getMessage() 是否保存您的信息?
  • DBException dbExe = new DBException(sqlExe); DBException objDbEx = (DBException) ExceptionUtil.populateSuperException(dbExe, strTraceMesg, ConstantsIF.SEVERE_LEVEL, false, null, null, null);抛出 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; }
  • 你能显示一些代码吗?包括正在使用的异常类?它是您创建的类还是标准的 java 异常?

标签: java exception-handling


【解决方案1】:

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

 exception.printStackTrace();

【讨论】:

  • 我没有使用 PrintStackTrace 或 stacktraceElement,我的记录器应该从 exception.getmessage() 返回字符串,这是要求。
  • 我的意思是现有代码是这样流动的,所以需要来自 ex.getMessage 的消息
【解决方案2】:

试试:

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

【讨论】:

  • 是 Exception.getCause().getMessage();这是有消息,为什么没有进入 Exception.getMessage()?
  • @SrideviLaks,你会在这里找到答案:stackoverflow.com/a/9017846/7022062 基本上可以包装异常(并且不止一次)。提供的链接允许您将其解包到问题的根本原因...
【解决方案3】:

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

所以如果异常确实有消息,那么它应该通过getMessage()返回并且成为toString()的一部分结果。

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


使您的代码可读后:您的DBException 被创建没有消息,所以dbExe.getMessage() 将返回null。要么查看原因,要么在创建时添加一条消息:

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

【讨论】:

  • 不,我回来了,我的 Exception .getMessage 给出了什么。
  • @Sridevi Laks - 您正在返回 dbExe.getMessage() 所提供的内容,而 那个 异常不携带消息。看看我的编辑和 oliholz 的建议
  • 谢谢大家,它正在工作。我必须调用构造函数或 DBException dbExe = new DBException(sqlExe.getMessage(), sqlExe);而不是 DBException dbExe = new DBException(sqlExe);
  • @Sridevi Laks - 请查看 SO FAQ 并使用 upvote / downvote 和 accept按钮,以防您喜欢/不喜欢或接受答案。这就是说“谢谢”的方式:)
  • @Andreas_D re:" 您的 DBException 是在没有消息的情况下创建的,因此 dbExe.getMessage() 将返回 null。" (下面的评论副本):这不太正确。构造函数 Throwable(Throwable Cause) 将使用 cause.toString() 更新消息。 cause.toString 至少会返回可抛出类的名称。我们假设在这种情况下 DBException(Exception ex) 调用了 super(ex),但情况可能并非如此。因此,我也要求查看该代码。
【解决方案4】:

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

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

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

【讨论】:

  • 这不太正确。构造函数 Throwable(Throwable Cause) 将使用 cause.toString() 更新消息。 cause.toString 将至少返回可抛出类的名称。我们假设在这种情况下 DBException(Exception ex) 调用了 super(ex),但情况可能并非如此。因此我也要求查看该代码。
  • @maasg 很好,我没有明确考虑过,但这完全取决于DBException 构造函数对单个参数的作用。事实上,我假设它不调用super(ex),只是因为这就是我工作过的文化总是做例外的方式(即,如果你不指定消息,大概你不想要一个,所以最好是null而不是超类的行为——尽管这是一个不同的论点)。
  • @ Andrzej Doyle - 投票表示感谢,感谢您的见解。 @ maasg - 是的,即使我有同样的想法,在这种情况下,我的 getMessage 应该有 thrwable 类名 - 但对我来说,它给出 null,我的 DBException constrcutor public DBException(Throwable throwable) { super(throwable); }
  • 还有一点要说这里我新建一个自定义异常 DBException dx= new DBException(sqlEX);并在其中传递我的 sql 异常,但是当 sql 对象位于 throwable 中时,在调试时,我只得到以下参数。异常 - java.sql.SQLException:详细描述 - 连接已关闭。连接已关闭。 next - null sql state - null 堆栈跟踪 - null vendor code 0
  • @Sridevi - 我不确定你的意思是什么。您是否尝试过在构造函数中明确提供消息?这将让getMessage()返回你想要的任何东西。
【解决方案5】:

根据 cmets 中的讨论,我的结论是,您的问题的根本原因在于 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 的实现作为所讨论问题的根本原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多