如何附加到 Java 异常?

2022-09-05 00:26:26

我是Java和一般例外的新手。

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

我经常发现,当我发现一个异常时,我想加两分钱,然后把它传下去。

如何做到这一点?我不想扔掉整个堆栈跟踪...我不知道失败发生得有多深,原因是什么。

我有一个小的实用程序库,用于将堆栈轨道(来自异常对象)转换为字符串。我想我可以将其附加到我的新异常消息中,但这似乎是一个黑客攻击。

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


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

答案 1

可以链接异常:

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

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

Something bad happened
... its stacktrace ...
Caused by:
... original exception, its stacktrace and causes ...

答案 2

通常,您抛出一个新异常,其中包括异常作为“原因”。大多数异常类都有一个接受“原因”异常的构造函数。(您可以通过以下方式获得此目的。Throwable.getCause()

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


推荐