我有一个java程序,它是Jasper Reports的编译器和执行程序,在我们的报告服务器上通过shell脚本调用。
我刚刚修复了由于缺少依赖性而导致的错误,但我花了一些时间来弄清楚出了什么问题。通常,捕获由编译过程引起的问题,将其记录到日志文件中并通过电子邮件发送给相关人员。由于这是一个NoClassDefFoundError,它基本上退出了程序,并从用户角度以静默方式失败。
我有什么方法可以捕获像这样的错误,以便它们也可以通过电子邮件发送出去?我有权修改执行的shell脚本。
答案 0 :(得分:0)
通常,应用程序代码不会捕获错误,并且会将错误抛出到JVM级别,并将它们打印到STDERR。因此,您跟踪此错误的方法是将STDERR重定向到文件:
java -cp YourMain 1>stdout.log 2>stderr.log
您也可以将STDOUT和STDERR放在一起:
java -cp YourMain 1>&2 2>wholelog.log
关于web中的流重定向有很多参考。如果我的例子不满足你,你可以看看那里。这取决于您的操作系统。
答案 1 :(得分: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());
}