【问题标题】:How do I append to a Java exception?如何附加到 Java 异常?
【发布时间】:2011-03-29 17:31:02
【问题描述】:

我是 Java 新手,一般来说都是例外。

在我之前的 C/Perl 编程时代,当我编写一个库函数时,错误是通过一个布尔标志以及某种带有人类友好(或程序员友好)错误消息的字符串传递回来的。 Java 和 C++ 有异常,这很方便,因为它们包含堆栈跟踪。

我经常发现当我捕捉到一个异常时,我想加我的两分钱,然后把它传递出去。

如何做到这一点?我不想丢弃整个堆栈跟踪...我不知道故障发生的深度以及原因。

我有一个小实用程序库来将堆栈跟踪(从异常对象)转换为字符串。我想我可以将它附加到我的新异常消息中,但这似乎是一个 hack。

下面是一个示例方法。建议?


    public void foo(String[] input_array) {
        for (int i = 0; i < input_array.length; ++i) {
            String input = input_array[i];
            try {
                bar(input);
            }
            catch (Exception e) {
                throw new Exception("Failed to process input [" 
                        + ((null == input) ? "null" : input)
                        + "] at index " + i + ": " + Arrays.toString(input_array) 
                        + "\n" + e);
            }
        }
    }

【问题讨论】:

  • 彼得:谢谢你的提示。我会这样做的。

标签: java exception stack-trace


【解决方案1】:

可以链接异常:

try {
    ...
} catch (Exception ex) {
    throw new Exception("Something bad happened", ex);
}

它使原始异常成为新异常的原因。可以使用getCause()获取异常原因,对新异常调用printStackTrace()会打印:

发生了不好的事情 ...它的堆栈跟踪... 造成的: ...原始异常,其堆栈跟踪和原因...

【讨论】:

  • 在这种情况下将 IOException 之类的扩展包装为更一般的异常 Exception 是否是最佳实践?
【解决方案2】:

通常您会抛出一个新异常,其中包含 old 异常作为“原因”。大多数异常类都有一个接受“原因”异常的构造函数。 (您可以通过Throwable.getCause() 获取此信息。)

请注意,您几乎不应该只捕获Exception - 通常您应该捕获更具体的异常类型。

【讨论】:

    【解决方案3】:

    只需使用不同的构造函数:

    Exception(String message, Throwable cause)
    

    消息是你的“两分钱”,你包括捕获的异常,它将显示在堆栈跟踪打印输出中

    【讨论】:

      【解决方案4】:

      您可以将根本原因添加到新创建的异常中:

          throw new Exception("Failed to process input [" 
                      + ((null == input) ? "null" : input)
                      + "] at index " + i + ": " + Arrays.toString(input_array) 
                      + "\n" + e.getMessage(), e);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2023-03-17
        • 2015-07-23
        • 1970-01-01
        • 2018-07-23
        • 2019-11-30
        • 2019-05-18
        相关资源
        最近更新 更多