想要在BIRT JavaScript错误时出现异常

时间:2013-06-07 07:12:20

标签: javascript birt

我在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)

感谢您的建议!

2 个答案:

答案 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;
}