GWT。在onFailure()中抛出异常

时间:2012-11-08 14:33:40

标签: java gwt

可以在GWT的RPC调用的onFailure()方法中抛出异常吗?因为这个方法将在稍后调用,在服务器响应之后,我道歉,这里可能会发生一些不好的事情。

例如:

public void method() {
       try {
            rpc.invoke(new AsyncCallback<Void>() {
               @Override
               public void onSuccess(Void arg0) {}

               @Override
               public void onFailure(Throwable arg0) {
                throw new RuntimeException("Error message");    //HERE
               }
            });
       }
       catch (Exception e) {
           Window.alert(e.getMessage());   // AND CATCH ABOVE EXCEPTION HERE
       }

    }

3 个答案:

答案 0 :(得分:1)

我通常在GWT项目中使用以下方法:

1)创建一个MyExceptionsHandler:

@Singleton
public class MyExceptionsHandler implements 
    GWT.UncaughtExceptionHandler,
    RpcFailureEvent.Handler, // create corresponding GwtEvent-s 
    AnyOtherErrorEvent.Handler {

  public MyExceptionsHandler(EventBus evenBus) {
    eventBus.addHandler(RpcFailureEvent.TYPE, this);
    eventBus.addHandler(AnyOtherErrorEvent.TYPE, this);
  } 

  // implement corresponding methods for interfaces

}

2)入口点:

GWT.setUnchaughtExceptionHandler(myExceptionHandler);

3)在任何其他地方,你有一个错误,你不知道如何处理:

rpc.invoke(new AsyncCallback<Void>() {
   @Override
   public void onSuccess(Void arg0) {}

   @Override
   public void onFailure(Throwable arg0) {
     eventBus.fireEvent(new RpcFailureEvent(<any context info you think helpful>));
   }
});

答案 1 :(得分:0)

不,你不能。好吧,您可以抛出异常,但它不会由您定义的catch块处理,因为AsyncCallback是一个匿名类,它不在同一范围内运行,并且不会与catch块同时调用。

然而,您可以尝试使用GWT.setUncaughtExceptionHandler(),请参阅http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/core/client/GWT.html处的详细信息。

答案 2 :(得分:0)

是的,这是可能的。

@Override
public void onFailure(Throwable arg0) {
  throw new RuntimeException(arg0);
}

此代码绝对有效。但是你创建和抛出RuntimeException的新实例的目的是什么?

如果你写的话

new RuntimeException("Error message")

您将丢失有关发生的异常的所有信息。

并且不要忘记在GWT中,所有从客户端到远程服务的调用都是异步处理的。当异步调用无法正常完成时,onFailure()回调方法立即被调用。