0

我有一个 java 程序,它是 Jasper Reports 的编译器和执行器,通过我们的报告服务器上的 shell 脚本调用。

我刚刚修复了一个由缺少依赖项引起的错误,但我花了一段时间才弄清楚出了什么问题。通常,由编译过程引起的问题会被捕获,记录到日志文件并通过电子邮件发送给相关人员。由于这是一个 NoClassDefFoundError,因此从用户的角度来看,它基本上退出了程序并以静默方式失败。

有什么方法可以让我捕捉到这样的错误,以便它们也可以通过电子邮件发送出去?我有权修改正在执行的 shell 脚本。

4

2 回答 2

0

通常,错误不会被应用程序代码捕获,而是被抛出到 JVM 级别,并在此打印到 STDERR。因此,跟踪此错误的方法是将 STDERR 重定向到文件:

java -cp YourMain 1>stdout.log 2>stderr.log

您还可以将 STDOUT 和 STDERR 放在一起:

java -cp YourMain 1>&2 2>wholelog.log

在 web 中有很多关于流重定向的参考资料。如果我的例子不能满足你,你可以看看那里。这取决于您的操作系统。

于 2012-05-15T06:45:12.147 回答
0

只是可以捕捉到错误,即

try {
        numericDefinition = new net.sf.cb2xml.def.BasicNumericDefinition(
                    binName, binarySizes, SynchronizeAt, usePositive, floatSynchronize, doubleSynchronize
            );
} catch (NoClassDefFoundError e) {
        System.out.println("Class Not Found: " + e.getMessage());
}

不过,您确实需要非常小心您的编码,在类初始化时很容易抛出NoClassDefFoundError而不会进入 try .. catch 块。

NoClassDefFoundError将在第一次引用一个类时抛出,这可能是当一个类使用一个使用一个类的类时,该类使用一个类......它使用一个引用不存在的类的类。

由于导入,以下可能会在类初始化时因NoClassDefFoundError而失败。

import net.sf.cb2xml.def.BasicNumericDefinition; // could cause the NoClassDefFoundError

     ...........
 try {
            numericDefinition = new BasicNumericDefinition(
                        binName, binarySizes, SynchronizeAt, usePositive, floatSynchronize, doubleSynchronize
                );
    } catch (NoClassDefFoundError e) {
            System.out.println("Class Not Found: " + e.getMessage());
    }
于 2012-05-15T07:11:48.157 回答