RuntimeException不会暂停GAE,但在本地运行时返回HTTP 500

时间:2014-03-03 15:11:16

标签: java google-app-engine servlets

首先让我提供一些背景资料。如果您不在乎,可以跳到下一段。我想使用与Google Drive集成的DrEdit sample 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环境。

1 个答案:

答案 0 :(得分:1)

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

无论如何,您的代码是故意的 - 您不应该继续处理请求并在发送重定向后抛出异常。如果您要进行任何处理,请在重定向之前执行此操作。

OTOH你不应该依赖通用异常处理。而是install a servlet filter that catches exceptions并返回正确的用户可读或设备可读响应。