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???
    }
}

JSNIからスローされた「例外オブジェクト」をラップする特別なGwt例外タイプはありますか?

4

2 に答える 2

6

gwtドキュメントから:

JSNIメソッド内の通常のJavaコードまたは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 に答える