4

我在本地方法中有一些逻辑,它返回 sth 或 null - 它们都是有效且有意义的状态,我想在方法失败时抛出异常。由于它是本机 JSNI,我不知道该怎么做。

所以考虑方法:

public final native <T> T myNativeMethod() /*-{

    //..some code


    //in javascript you can throw anything, not only the exception object:
    throw "something"; 

}-*/;

但是如何捕捉抛出的物体?

void test() {
    try {
        myNativeMethod();
    }
    catch(Throwable e) { // what to catch here???
    }
}

是否有任何特殊的 Gwt 异常类型包装从 JSNI 抛出的“异常对象”?

4

2 回答 2

6

来自 gwt 文档:

在执行普通 Java 代码或 JSNI 方法中的 JavaScript 代码期间,可能会引发异常。当在 JSNI 方法中生成的异常向上传播调用堆栈并被 Java catch 块捕获时,抛出的 JavaScript 异常在被捕获时被包装为 JavaScriptException 对象。此包装器对象仅包含发生的 JavaScript 异常的类名和描述。推荐的做法是处理 JavaScript 代码中的 JavaScript 异常和 Java 代码中的 Java 异常。

这是完整的参考: http: //www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#exceptions

于 2012-07-18T18:18:46.243 回答
5

至于丹尼尔·库尔卡的回答(和我的直觉;))。我的代码可能看起来像这样:

public final native <T> T myNativeMethod() throws JavaScriptException /*-{

    //..some code


    //in javascript you can throw anything it not just only exception object:
    throw "something"; 

    //or in another place of code
    throw "something else";

    //or:
    throw new (function WTF() {})();

}-*/;

void test() throws SomethingHappenedException, SomethingElseHappenedException, UnknownError {
    try {
        myNativeMethod();
    }
    catch(JavaScriptException e) { // what to catch here???

        final String name = e.getName(), description = e.toString(); 

        if(name.equalsIgnoreCase("string")) {

            if(description.equals("something")) {
                throw new SomethingHappenedException(); 
            }
            else if(description.equals("something else")) {
                throw new SomethingElseHappenedException(); 
            }
        }
        else if(name.equals("WTF")) {
            throw new UnknownError();
        }
    }
}
于 2013-08-30T07:44:23.550 回答