GWT - 无法使用UncaughtExceptionHandler捕获StatusCodeException

时间:2018-01-10 15:38:02

标签: java gwt exception-handling tomcat8 http-error

当Tomcat会话超时时,我想将我的用户重定向到我的GWT应用程序的主页,以便他们可以再次登录。为了强制执行此操作,我试图在用户尝试在会话超时后执行任何操作时使用GWT抛出的StatusCodeException -

SEVERE: com.google.gwt.user.client.rpc.StatusCodeException: 0  

为实现这一目标,我使用以下代码 -

public void onModuleLoad() {
    GWT.UncaughtExceptionHandler uncaughtExceptionHandler = new GWT.UncaughtExceptionHandler() {
        public void onUncaughtException(Throwable e) {
            if (e instanceof StatusCodeException) {
                logger.log(Level.ERROR, "Exception caught!");
                logger.log(Level.ERROR, ((StatusCodeException) e).getStatusCode());
            }
        }
    };
    GWT.setUncaughtExceptionHandler(uncaughtExceptionHandler);
    try {
        // rest of the code in onModule() - I'm expecting any operation to throw StatusCodeException when session times out.
    } catch (RuntimeException ex) {
        uncaughtExceptionHandler.onUncaughtException(ex);
    }
}

这不起作用。而不是被代码捕获,StatusCodeException正在控制台上显示。我在这里做错了什么?

我们的想法是捕获StatusCodeException并使用其getStatusCode()方法来确定HTTP错误代码是否为403。如果是,我想使用Window.Location.assign("https://example.com/redirect");将它们重定向到登录页面。

1 个答案:

答案 0 :(得分:1)

   onFailure(Throwable caught) { 
       logger.error(caught); 
   }

您的AsyncCallback.onFailure正在执行您要求它执行的操作 - 它正在记录错误,但不会抛出错误。因为它没有被抛出,所以未被捕获的异常处理程序不处理它(它不能被捕获,如果它没有被抛出......如果这是有道理的。)

一个选项可能是您可以使用throw caught填充方法,但java不会喜欢这个。相反,对您的具体内容的最简单答案就是将其传递给处理程序:

   onFailure(Throwable caught) { 
       GWT.getUncaughtExceptionHandler().onUncaughtException(ex);
   }

你有另一个选择:因为没有AsyncCallback会抛出这个,所以将StatusCodeException放在UncaughtExceptionHandler中似乎有点奇怪。相反,请考虑制作自己的AsyncCallback基类,如下所示:

public abstract class NetworkAsyncCallback<T> implements AsyncCallback<T> {
    @Override
    public void onFailure(Throwable t) {
        if (e instanceof StatusCodeException) {
            logger.log(Level.ERROR, "Exception caught!");
            logger.log(Level.ERROR, ((StatusCodeException) e).getStatusCode());
        }
    }
}

现在,当您拨打电话时,您只需传入新的NetworkAsyncCallback<T>并仅实施onSuccess。如果要做的就是将异常传递给未捕获的处理程序,则可以跳过onFailure。或者,如果您有其他逻辑,则可以覆盖onFailure,处理相应的异常,并使用任何其他错误调用super.onFailure(caught),以便超类处理它。

myServer.getSomeData(param, new NetworkAsyncCallback<Result>() {
    @Override
    public void onSuccess(Result result) {
        //...
    }
    // Skip onFailure, or if you need custom logic, implement it, 
    // and call super only if the exception isn't part of that logic
});