2016-02-25 90 views
3

我有一個使用Activiti引擎的項目。 它支持使用Nashorn運行腳本。 我在腳本任務或任務偵聽器中運行此代碼沒有問題。 但是,當使用執行監聽器我有問題。從內部拋出異常javascript

在我的腳本中,我想拋出一個應該被java代碼捕獲的錯誤。 例如:

throw new Error("this is an error"); 

但我得到一個錯誤:

problem evaluating script: Error: this is an error in scripts/error.js at line number 8 at column number 1 

我自己也嘗試這種最初:

var BpmnError = Java.type(org.activiti.engine.delegate.BpmnError'); 
    throw new BpmnError("BusinessExeptionOccured","a Message"); 

在這種情況下沒有錯誤捕獲過程如同扔從未發生了。

在它規定的Activiti的文檔:

As of Activiti 5.9, it is possible to throw BPMN Errors from user code inside Service Tasks or Script Tasks. In order to do this, a special ActivitiException called BpmnError can be thrown in JavaDelegates or scripts 

我一直沒能找到如何可以做到這一點的任何例子。

我還沒有看到可以拋出一個jdk.nashorn.internal.runtime.ECMAException 在opendJDK ECMAException註釋的JavaScript代碼的任何實例指出:

Exception used to implement ECMAScript "throw" from scripts. 

任何幫助,這可以理解。

+1

我已經更新的問題,並刪除註釋。 –

+0

您是否嘗試了Lian的建議(他還在評論中添加了它,使其很難找到)? 'try {// eval something} catch(ScriptException sx){sx.printStackTrace(); }}' –

回答

-1

扔「這是一個錯誤」;

這裏有一個解釋:JavaScript error handling。由於Nashorn實現了ECMAScript 5.1(正如此處所聲稱的OpenJDK Wiki, Nashorn extensions),所以正常的JavaScript錯誤處理應該可以工作。

+0

OP請求「*我想拋出應該被Java代碼捕獲的錯誤*」 –

+0

您已經可以捕捉到這個:try {// eval something } catch(ScriptException sx){ \t sx .printStackTrace(); } } 結果是:腳本錯誤:javax.script.ScriptException:柱在行號9在列號2 \t在jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException實測值(NashornScriptEngine.java :467) \t at jdk.nashorn.api.scripting。NashornScriptEngine.evalImpl(NashornScriptEngine.java:451) – Lian

+0

修復您的答案,而不是使用評論。評論中的內容不夠易讀,評論不適合你寫答案。 –

0

在Activiti的腳本任務,你可以使用以下命令:

throw ("Message") 

我希望這可以幫助您

+0

腳本任務和任務偵聽器正常工作。那裏沒問題。 這是具體執行監聽器有這個問題。 –

1

可以趕上ScriptException,然後從那裏訪問拋出的ECMAScript對象。

示例代碼:

import javax.script.*; 
import jdk.nashorn.api.scripting.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     ScriptEngineManager m = new ScriptEngineManager(); 
     ScriptEngine e = m.getEngineByName("nashorn"); 
     try { 
      e.eval("throw new Error('this is an error');"); 
     } catch (ScriptException se) { 
      // get the original cause 
      Throwable cause = se.getCause(); 
      // in this case, the cause is a nashorn exception 
      if (cause instanceof NashornException) { 
       NashornException ne = (NashornException)cause; 
       // Access the underlying ECMAScript error object thrown 
       Object obj = ne.getEcmaError(); 
       // print ECMA object 'as is' 
       System.out.println(obj); 

       // In this example, the thrown ECMAScript object is 
       // an instanceof Error. Script objects are accessible 
       // as JSObject in java code. 
       if (obj instanceof JSObject) { 
        JSObject jsObj = (JSObject)obj; 
        System.out.println(jsObj.getMember("message")); 
        System.out.println(jsObj.getMember("name")); 
        // access nashorn specific 'stack' property 
        System.out.println("stack trace: " + jsObj.getMember("stack")); 
       } 
      } 
     } 
    } 
} 
+0

我不認爲問題出在nashorn上,我沒有java代碼。 這個問題特定於Activiti BMPN引擎。 –