GWT.setUncaughtExceptionHandler () - PullRequest
       1

GWT.setUncaughtExceptionHandler ()

15 голосов
/ 12 июня 2010

Кто-нибудь успешно использовал приведенный выше оператор, чтобы перехватить исключение, прежде чем оно отправится в браузер в качестве предупреждения?

Я зарегистрировал пользовательский обработчик исключений в первой строке точки входа моего приложения. Но это не ловит исключение, как ожидалось.

public void onModuleLoad(){
    GWT.setUncaughtExceptionHandler(new MyExceptionHandler());
    ...
    ....
}

EDIT

Вот мои два класса:

Я ожидаю, что мой system.out напечатает детали исключения и исключение будет проглочено и не должно отправляться в браузер.

Или я не прав?

package mypackage;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;

public class MyEntryPoint implements EntryPoint {

    public void onModuleLoad() {
    GWT.setUncaughtExceptionHandler(new ClientExceptionHandler());
    startApplication();
    }

    private void startApplication() {
    Integer.parseInt("I_AM_NOT_NUMBER");
    }
}

package mypackage;

import com.google.gwt.core.client.GWT;

public class ClientExceptionHandler implements GWT.UncaughtExceptionHandler {

    @Override
    public void onUncaughtException(Throwable cause) {
    System.out.println(cause.getMessage());
    }
}

Ответы [ 4 ]

21 голосов
/ 23 июня 2010

Я считаю, что здесь происходит то, что текущий цикл событий JS использует DefaultUncaughtExceptionHandler, потому что это был обработчик, установленный в начале цикла. Вам нужно будет отложить дальнейшую инициализацию до следующего цикла событий, например:

public void onModuleLoad() {
    GWT.setUncaughtExceptionHandler(new ClientExceptionHandler());
    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
        @Override
        public void execute() {
           startApplication();
           Window.alert("You won't see this");
        }
    });
}

private void startApplication() {
    Integer.parseInt("I_AM_NOT_A_NUMBER");
    // or any exception that results from server call
}

Обновление: И вот проблема , которая описывает, почему это работает, и почему это не планируется исправить.

1 голос
/ 17 июля 2012

Настройка обработчика по умолчанию может быть непростым делом. Я могу сказать вам точно, что происходит. Если вы получите исключение в onModuleLoad (), обработчик вызываться не будет. Только после того, как метод загрузки будет завершен, он НАСТОЯЩИМ будет введен в действие.

0 голосов
/ 08 февраля 2017

Глупое решение, но работает отлично!прежде чем что-либо добавить EntryPoint в ваш app.gwt.xml

<entry-point class='myPackage.client.MyEntryPoint' />

затем;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;
public class MyEntryPoint implements EntryPoint {

    private EventBus eventBus;
    @Inject
    public MyEntryPoint(final EventBus eventBus){
        this.eventBus = eventBus;
    }

    @Override
    public void onModuleLoad() {

        CustomUncaughtExceptionHandler customUncaughtExceptionHandler = new CustomUncaughtExceptionHandler();
        GWT.setUncaughtExceptionHandler(customUncaughtExceptionHandler);
        try {
            onModuleLoad2();
        } catch (RuntimeException ex) {
            eventBus.fireEvent(new BusyEvent(false));
            customUncaughtExceptionHandler.onUncaughtException(ex);
        }

    }

    private void onModuleLoad2() {
        throw new RuntimeException("test");
    }
}

и ваш CustomUncaughtExceptionHandler будет выглядеть примерно так:

import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
import com.google.gwt.event.shared.UmbrellaException;
import com.google.gwt.user.client.Window;
public class CustomUncaughtExceptionHandler implements UncaughtExceptionHandler {
    @Override
    public void onUncaughtException(Throwable e) {
        Throwable exceptionToDisplay = getExceptionToDisplay( e );
         Window.alert( exceptionToDisplay.getCause() .getMessage()+"    "+ exceptionToDisplay.getStackTrace());

    }
    private static Throwable getExceptionToDisplay( Throwable throwable ) {
         Throwable result = throwable;
         if (throwable instanceof UmbrellaException && ((UmbrellaException) throwable).getCauses().size() >= 1) {
             result = ((UmbrellaException) throwable).getCauses().iterator().next();
         }
         return result;
    }

}
0 голосов
/ 12 июня 2010

Вы должны попробовать следующее:

public void onModuleLoad(){
    GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        onUncaughtException(Throwable t) {
            // Do stuff here
        }
    });
}

и посмотреть, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...