我在BIRT中有一个包含非平凡JavaScript(脚本数据源)的报告。 JavaScript有点不稳定,并且怀疑要回归。出于这个原因和其他人,我编写了一个JUnit测试来填充数据,运行报告(createRunAndRenderTask
并运行该任务)并对生成的报告进行一些验证。
显然,当BIRT引擎抛出任何异常时,此测试将失败。但是,在报告中出现JavaScript错误时,不会抛出任何异常。这感觉并不好。我可以以某种方式更改此以使BIRT引擎在JavaScript错误时抛出异常吗?
我在开发报告期间遇到了大量JavaScript错误,因此尝试了这一点。想想脚本数据源中的拼写错误。它们在控制台中吐出,但没有例外。
E.g:
<method name="open"><![CDATA[count = 0;
this should break]]></method>
这在控制台中显示:
... Fail to execute script in function __bm_OPEN(). Source:
------
" + count = 0;
this should break + "
-----
A BIRT exception occurred. See next exception for more information.
ReferenceError: "this should break" is not defined. (/report/data-sets/script-data-set[@id="9"]/method[@name="open"]#3)
感谢您的建议!
答案 0 :(得分:3)
我最终做到了这一点并且相当不错:
IRunAndRenderTask task = ...
...
task.setErrorHandlingOption(IEngineTask.CANCEL_ON_ERROR);
...
task.run();
evaluateStatus(task, reportName);
task.close();
和
private void evaluateStatus(IRunAndRenderTask task, String reportName) {
if (task.getStatus() == IEngineTask.STATUS_CANCELLED) {
String message = "report failed: " + reportName;
List<Throwable> errors = task.getErrors();
if (!errors.isEmpty()) {
throw new RuntimeException(message, errors.get(errors.size() - 1));
}
throw new RuntimeException(message);
}
}
答案 1 :(得分:2)
根据javascript错误,BIRT引擎会捕获它们并仍然尝试显示报告。
我认为您可以通过将javascript代码(Rhino脚本)包装在try ... catch表达式中来覆盖它,并且如果发生错误则明确地抛出BirtException:
try{
//your javascript stuff
var test=null;
test.toString();
}catch(e){
var exception=new org.eclipse.birt.core.exception.BirtException("Custom exception:"+e);
throw exception;
}