RuntimeException不会停止GAE,但在本地运行时返回HTTP500



让我先提供一些背景信息。如果你不在乎,你可以跳到下一段。我想使用与Google Drive集成的DrEdit示例Java应用程序作为我的应用程序的基础。不过,我需要重构代码,因为最初的场景假设用户只能通过驱动器访问应用程序,而不能直接访问。目前,当发生后一种情况时,会抛出RuntimeException,而正常流中不应该出现这种情况。

由于这个问题,我偶然发现了本地环境和GAE之间的差异,这在运行以下代码时表现出来:

} catch (CredentialMediator.NoRefreshTokenException e) {
try {
resp.sendRedirect(e.getAuthorizationUrl());
} catch (IOException ioe) {
throw new RuntimeException("Failed to redirect user for authorization");
}
throw new RuntimeException("No refresh token found. Re-authorizing.");
}

当我在GAE上运行这个应用程序时,会抛出RuntimeException(我可以在日志中看到它),并且还会执行sendRedirect,所以我可以看到应该显示的页面。

然而,当我在本地运行同一个应用程序时,我会收到HTTP 500错误,并显示RuntimeException,但sendRedirect被忽略。

到目前为止,我还没有成功地找到这种行为的解释。我想知道为什么会出现这种情况,以及是否有可以更改的设置,以便在本地完全复制GAE环境。

这就是标准定义sendRedirect()的方式。它实际上提交了响应,因此在调用此方法后,您应该无法更改或添加到响应中。然而,它并没有定义如果在重定向后触发异常会发生什么。

无论如何,您的代码是故意模棱两可的——您不应该继续处理请求并在发送重定向后抛出异常。如果你有任何处理要做,那么在重定向之前先做。

OTOH您不应该依赖于一般的异常处理。相反,安装一个servlet过滤器,用于捕获异常并返回正确的用户可读或设备可读响应。

最新更新