2016-09-19 58 views
3

我使用来自Java应用程序的Nashorn脚本。 Java设置上下文(包括errorWriter)和一切正常工作... 但我还没有找到方式来写入从nashorn脚本的错误流。有人知道吗 ?如何写入Nashorn错误流?

我试图抛出一个错误,但它在scriptException中输出,而不是在错误输出流中。

谢谢你的任何想法。

回答

1

It looks like没有内置函数写入stderr,就像有一个写入stdoutprint)。

但是,您可以在ScriptContext中设置一个属性,该属性具有写入其错误编写器的函数。

ScriptEngine se = ...; 

ScriptContext sc = se.getContext(); 
sc.setAttribute("stderr", // name is 'stderr' 
    (Consumer<String>) str -> { // Object is a Consumer<String> 
     try { 
      Writer err = sc.getErrorWriter(); 
      err.write(str); 
      err.flush(); 
     } catch (Exception e) { 
      throw new Error(e); 
     } 
    }, 
    ScriptContext.ENGINE_SCOPE // i.e. don't share with other engines 
); 

之所以做这种方式,而不是直接绑定错误作家的对象,是你仍然可以在以后更改错误的作家,它仍然可以工作。

之后,你可以这样做:

sc.setErrorWriter(new PrintWriter(new OutputStream() {   
    @Override 
    public void write(int b) throws IOException { 
     System.err.write(b);     
    } 
})); 

哪会写所有的错误到Java stderr(这不是BTW默认值)。

然后从JavaScript,你可以这样做:

var error = function(message) { // A nice wrapper function 
    stderr.accept(message); // 'accept', since we passed a `Consumer<...>` 
}; 

error('error'); // Will now print to Java's stderr 
+0

明确的答案,谢谢 – xaevus