首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT -无法用StatusCodeException捕获UncaughtExceptionHandler

GWT -无法用StatusCodeException捕获UncaughtExceptionHandler
EN

Stack Overflow用户
提问于 2018-01-10 15:38:01
回答 1查看 654关注 0票数 0

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

代码语言:javascript
复制
SEVERE: com.google.gwt.user.client.rpc.StatusCodeException: 0  

为了达到这个目的,我使用了以下代码-

代码语言:javascript
复制
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");将它们重定向到登录页面。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-11 05:29:33

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

您的AsyncCallback.onFailure正在做您要求它做的事情--它正在记录错误,而不是抛出错误。因为它没有被抛出,所以未被抛出的异常处理程序不能处理它(如果没有抛出它就不能不被捕获.如果这有意义的话)。

一个选项可能是您可以使用throw caught填充该方法,但是java不会喜欢这样的。相反,对特定on的最简单的回答是将其传递给处理程序:

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

还有一个选项:由于没有AsyncCallback会抛出这个选项,将StatusCodeException放到UncaughtExceptionHandler中似乎有点奇怪。相反,考虑创建自己的AsyncCallback基类,如下所示:

代码语言:javascript
复制
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),以便超类处理它。

代码语言:javascript
复制
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
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48190989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档