Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GraalVM中的异常链_Java_Exception_Graalvm - Fatal编程技术网

Java GraalVM中的异常链

Java GraalVM中的异常链,java,exception,graalvm,Java,Exception,Graalvm,我使用GraalVM来执行JavaScript文件,但在异常处理方面遇到了问题。我的JS代码将调用返回Java,如果从这些Java方法中的一个抛出异常,那么我将丢失原因链 public class Example { public static void doSomething() { throw new RuntimeException("Example", new RuntimeException("Some nested exception")); } }

我使用GraalVM来执行JavaScript文件,但在异常处理方面遇到了问题。我的JS代码将调用返回Java,如果从这些Java方法中的一个抛出异常,那么我将丢失原因链

public class Example {
    public static void doSomething() {
        throw new RuntimeException("Example", new RuntimeException("Some nested exception"));
    }
}

// --------------

var Example = Java.type("ex.Example");
function f() {
    Example.doSomething();
}

// -------------

String src = ... 
Source s = Source.newBuilder("js", src, "example").build();
try {
    context.eval(s);
} catch (PolyglotException e) {
    e.printStackTrace(); // This only prints the PolyglotException with the message "Example"
}
发生这种情况的原因是,Graal/Truffle创建了一个
HostException
的实例,该实例的构造函数不调用
super(e)
,它将其分配给一个内部字段,该字段用于获取消息,而不调用其他内容。这似乎是故意的,但我不明白原因。这是安全问题吗?你能想个办法改变这种行为吗?我非常希望在我的日志中有异常的完整原因,但现在它停在
HostException
,它通常只是说类似于“
A
”(例如,如果错误的原始原因是A
NoTouchElementException(“A”)


我也遇到过同样的问题,结果证明,JS错误具有以下功能:

printStackTrace: [Function],
fillInStackTrace: [Function],
getCause: [Function],
initCause: [Function],
toString: [Function],
getMessage: [Function],
getLocalizedMessage: [Function],
getStackTrace: [Function],
setStackTrace: [Function],
addSuppressed: [Function],
getSuppressed: [Function]
例如,打印java堆栈跟踪:

try {
    Java.type('ClassWithException').throwRuntimeEx();
} catch (e) {
    console.log(e.printStackTrace())
}
提供以下信息:

java.lang.RuntimeException: Example message
at ex.ClassWithException.throwRuntimeEx(ClassWithException.java:6)
at com.oracle.truffle.polyglot.HostMethodDesc$SingleMethod$MHBase.invokeHandle(HostMethodDesc.java:269)
at com.oracle.truffle.polyglot.HostMethodDesc$SingleMethod$MHBase.invoke(HostMethodDesc.java:261)
at com.oracle.truffle.polyglot.HostExecuteNode$1.executeImpl(HostExecuteNode.java:776)
at com.oracle.truffle.polyglot.GuestToHostRootNode.execute(GuestToHostRootNode.java:87)
at org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callProxy(OptimizedCallTarget.java:328)
...
at com.oracle.truffle.polyglot.PolyglotValue$InteropValue.execute(PolyglotValue.java:2008)
at org.graalvm.polyglot.Value.execute(Value.java:338)
at com.oracle.truffle.trufflenode.GraalJSAccess.isolateEnterPolyglotEngine(GraalJSAccess.java:2629)
Caused by: java.lang.RuntimeException: Inner exception
... 245 more

我也遇到过同样的问题,结果证明,JS错误具有以下功能:

printStackTrace: [Function],
fillInStackTrace: [Function],
getCause: [Function],
initCause: [Function],
toString: [Function],
getMessage: [Function],
getLocalizedMessage: [Function],
getStackTrace: [Function],
setStackTrace: [Function],
addSuppressed: [Function],
getSuppressed: [Function]
例如,打印java堆栈跟踪:

try {
    Java.type('ClassWithException').throwRuntimeEx();
} catch (e) {
    console.log(e.printStackTrace())
}
提供以下信息:

java.lang.RuntimeException: Example message
at ex.ClassWithException.throwRuntimeEx(ClassWithException.java:6)
at com.oracle.truffle.polyglot.HostMethodDesc$SingleMethod$MHBase.invokeHandle(HostMethodDesc.java:269)
at com.oracle.truffle.polyglot.HostMethodDesc$SingleMethod$MHBase.invoke(HostMethodDesc.java:261)
at com.oracle.truffle.polyglot.HostExecuteNode$1.executeImpl(HostExecuteNode.java:776)
at com.oracle.truffle.polyglot.GuestToHostRootNode.execute(GuestToHostRootNode.java:87)
at org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.callProxy(OptimizedCallTarget.java:328)
...
at com.oracle.truffle.polyglot.PolyglotValue$InteropValue.execute(PolyglotValue.java:2008)
at org.graalvm.polyglot.Value.execute(Value.java:338)
at com.oracle.truffle.trufflenode.GraalJSAccess.isolateEnterPolyglotEngine(GraalJSAccess.java:2629)
Caused by: java.lang.RuntimeException: Inner exception
... 245 more

老兄,你有没有找到一种打印原因链的方法?@Mirian,我有点误解了这种情况。通过读取(或重新抛出)
asHostException()
,可以从
PolyglotException
获取原始异常。你应该先检查
isHostException()
,如果这是
false
,那么这是一个javascript错误,而且没有Java land异常来获取atMan,你找到了打印原因链的方法吗?@Mirian,我有点误解了情况。通过读取(或重新抛出)
asHostException()
,可以从
PolyglotException
获取原始异常。您应该首先检查
isHostException()
,如果这是
false
,那么这是一个javascript错误,并且没有Java land异常