GWT.setUncaughtExceptionHandler()
Кто-нибудь успешно использовал вышеуказанный оператор, чтобы поймать исключение, прежде чем он отправится в браузер в качестве предупреждения?
Я зарегистрировал пользовательский обработчик исключений в первой строке точки ввода моего приложения. Но это не исключение, как ожидалось.
public void onModuleLoad(){
GWT.setUncaughtExceptionHandler(new MyExceptionHandler());
...
....
}
ИЗМЕНИТЬ
Вот мои два класса:
Я ожидаю, что моя 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());
}
}
Ответы
Ответ 1
Я считаю, что здесь происходит то, что текущий цикл событий 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
}
Обновление: И здесь проблема, которая описывает, почему это работает, и почему это не планируется исправлена.
Ответ 2
Вы должны попробовать следующее:
public void onModuleLoad(){
GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
onUncaughtException(Throwable t) {
// Do stuff here
}
});
}
и посмотрите, помогает ли это.
Ответ 3
Настройка обработчика по умолчанию может быть сложным предложением несколько раз. Я могу точно сказать, что происходит. Если вы получите исключение в onModuleLoad(), обработчик не будет вызван. Только после того, как метод загрузки будет завершен, он будет НАСТОЯЩИМ встать на место.
Вы можете прочитать обсуждение на Учебник GWT, чтобы узнать немного больше.
Ответ 4
Глупый раствор, но он отлично работает!
прежде чем что-либо добавить свой 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;
}
}