gpt4 book ai didi

java - GWT - 无法使用 UncaughtExceptionHandler 捕获 StatusCodeException

转载 作者:行者123 更新时间:2023-12-02 11:46:09 25 4
gpt4 key购买 nike

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

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");将他们重定向到登录页面。

最佳答案

   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)任何其他错误,以便父类(super class)处理它。

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

关于java - GWT - 无法使用 UncaughtExceptionHandler 捕获 StatusCodeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48190989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com