2

我在 BIRT 中有一份报告,其中包含非平凡的 JavaScript(脚本数据源)。JavaScript 有点不稳定,并且怀疑会倒退。出于这个原因和其他原因,我编写了一个 JUnit 测试来填充数据、运行报告(createRunAndRenderTask并运行该任务)并对生成的报告进行一些验证。

显然,当 BIRT 引擎抛出任何异常时,该测试将失败。但是,在报告中出现 JavaScript 错误时,不会引发异常。这感觉不太好。我可以以某种方式更改它以使 BIRT 引擎在 JavaScript 错误时抛出异常吗?

我通过在报告开发过程中出现大量 JavaScript 错误来尝试此操作。想想脚本数据源中的拼写错误。它们在控制台中被吐出,但也不例外。

例如:

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

谢谢你的建议!

4

2 回答 2

4

我最终做到了这一点并且很好:

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);
    }
}
于 2013-06-28T03:55:07.907 回答
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;
}
于 2013-06-22T12:25:00.123 回答