2013-10-15 4 views
0

Я использую GWTP и RequestFactory на моем клиенте.GWT's UncaughtExceptionHandler не получает вызов (с использованием GWTP и RF)

Я хотел бы, чтобы любое Fatal Exception обрабатывалось обычным 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"); 

Исключение не захваченной , В режиме dev я вижу, что неперехваченное исключение полностью заходит в консоль разработки. Далее отладка показывает, что GWT не зарегистрировал свой собственный обработчик:

handler = GWT.getUncaughtExceptionHandler(); 

возвращается

[email protected]70563b1

Любые идеи о почему GWT.setUncaughtExceptionHandler не работает?

Для справки я следовал за этим post от cleancodematters. Единственное различие между его реализацией и моей заключается в том, что я использую GWTP (и GIN) для клиента.

ответ

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"); 
      } 
     }); 
    } 
} 
+0

Я, конечно, пропустил этот один бит информации. Спасибо, что указали! – manubot

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

В тестовом случае, ошибка принимается как фатальная ошибка? Если ошибка не отмечена как фатальная, то реализация по умолчанию будет делать именно то, что вы видите ... ничего.

+0

спасибо, ваша точка является точной. Однако исключение действительно было фатальным. Я думаю, что я могу исключить вопрос фабрики РФ отсюда. см. мой обновленный Q – manubot

0

Любой JS-код, выполняемый в обратном вызове, должен обернуть вызовы в GWT с помощью $ entry, чтобы любые неперехваченные исключения правильно маршрутизировались. Если это не происходит, это звучит как ошибка в GWTP (или, возможно, RequestFactory, хотя это кажется менее вероятным, поскольку оно является частью GWT).

+0

, в моем приложении нет специального JS-кода. Это может быть вещь GWTP, пожалуйста, посмотрите мое обновление на Q и сообщите мне, есть ли у вас какие-либо идеи. – manubot