不会调用GWT的UncaughtExceptionHandler(使用GWTP和RF)

时间:2013-10-15 14:04:01

标签: gwt requestfactory gwtp

我在客户端上使用GWTP和RequestFactory。

我希望任何致命异常都由自定义UncaughtExceptionHandler处理。我创建了自定义处理程序并在我的入口点模块的configure()调用中注册它:

public class ClientModule extends AbstractPresenterModule {
    @Override
    protected void configure() {

        // Register Uncaught Exception Handler first thing
        GWT.setUncaughtExceptionHandler( new CustomUncaughtExceptionHandler() );
...

但是,如果在我的客户端,我会抛出异常

throw new RuntimeException("test");

未捕获异常。在开发模式下,我看到未捕获的异常一直到开发控制台。进一步调试显示GWT尚未注册我的自定义处理程序:

handler = GWT.getUncaughtExceptionHandler();

返回

  

com.google.gwt.core.client.GWT$DefaultUncaughtExceptionHandler@370563b1

关于为什么GWT.setUncaughtExceptionHandler不起作用的任何想法?

为了记录,我通过cleancodematters跟踪了这个post。他的实现和我的实现之间的唯一区别是我在客户端使用GWTP(和GIN)。

3 个答案:

答案 0 :(得分:1)

肯定会调用onFailure方法,因为您可以覆盖它并获得有效的响应,因此查看Receiver#onFailure的默认实现:

/**
 * Receives general failure notifications. The default implementation looks at
 * {@link ServerFailure#isFatal()}, and throws a runtime exception with the
 * failure object's error message if it is true.
 * 
 * @param error a {@link ServerFailure} instance
 */
public void onFailure(ServerFailure error) {
  if (error.isFatal()) {
    throw new RuntimeException(error.getMessage());
  }
}

在您的测试用例中,是否收到错误是致命错误?如果错误没有标记为致命错误,那么默认实现将完全按照您所看到的内容进行操作......没有。

答案 1 :(得分:1)

我认为您无法使用GIN的ClientModule来设置UncaughtExceptionHandler。 而是创建自定义PreBootstrapper

A PreBootstrapper allows you to hook into the GWTP bootstrapping process right before it
starts. This is particularly useful if you need something done before GWTP starts up. In 
general the use of a Bootstrapper is advised but there are cases where that is not
enough,for example when setting up an UncaughtExceptionHandler for gwt-log.
<set-configuration-property name="gwtp.prebootstrapper"  
         value="com.arcbees.project.client.PreBootstrapperImpl"/> 

public class PreBootstrapperImpl implements PreBootstrapper {
    @Override
    public void onPreBootstrap() {
        GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
            @Override
            public void onUncaughtException(final Throwable e) {
                Window.alert("There was a problem loading your application");
            }
        });
    }
} 

答案 2 :(得分:0)

在回调中运行的任何JS代码都必须使用$ entry将调用包装到GWT中,以便正确路由任何未捕获的异常。如果没有发生这听起来像GWTP中的错误(或者可能是RequestFactory,尽管这似乎不太可能,因为它是GWT的一部分)。