WelcomeTo
WelcomeTo

Reputation: 20581

GWT. Throw exception inside onFailure()

It is possible to throw exception inside onFailure() method of GWT's RPC call? Because this method will be called later, after server response, I apologize that here may happen something bad..

For example:

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
       }

    }

Upvotes: 0

Views: 2069

Answers (3)

Andrey Mormysh
Andrey Mormysh

Reputation: 819

I usually use the following approach on my GWT projects:

1) Create an 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) On entry point:

GWT.setUnchaughtExceptionHandler(myExceptionHandler);

3) In any other place you have an error, which you don't know how to handle:

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>));
   }
});

Upvotes: 1

MikeN
MikeN

Reputation: 907

No, you can't. Well, you can throw the exception, but it won't be handled by the catch block you defined, since the AsyncCallback is an anonymous class that does not run in the same scope and is not called at the same time as your catch block.

You can however try to use GWT.setUncaughtExceptionHandler(), see the details at http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/core/client/GWT.html.

Upvotes: 0

kapandron
kapandron

Reputation: 3671

Yes, it's possible.

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

This code is absolutely valid. But to what purpose are you creating and throwing a new instance of RuntimeException?

At that if you write

new RuntimeException("Error message")

you lose all information about occurred exception.

And don't forget that in GWT all calls from client to a remote service are handled asynchronously. And the onFailure() callback method are called immediatly when an asynchronous call fails to complete normally.

Upvotes: 0

Related Questions