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

Java RuntimeException不会停止GAE,但在本地运行时返回HTTP 500,java,google-app-engine,servlets,Java,Google App Engine,Servlets,首先让我提供一些背景资料。如果你不在乎,你可以跳到下一段。我想使用与GoogleDrive集成的Java应用程序作为我的应用程序的基础。不过,我需要重构代码,因为最初的场景假设用户只能通过驱动器访问应用程序,而不会直接访问。当前,当发生后一种情况时,会抛出一个RuntimeException,这在正常流中不应该发生 由于这个问题,我偶然发现本地环境与GAE之间存在差异,这在运行以下代码时表现出来: } catch (CredentialMediator.NoRefreshTokenExcepti

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

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

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


OTOH您不应该依赖于通用异常处理。而是返回一个用户可读或设备可读的正确响应。

谢谢您的解释,Peter。然而,我已经知道了这些问题,正如我所说的,我知道我需要重写这段代码(感谢这些指针)。我感兴趣的是找出为什么在GAE和本地运行web应用时,行为会有所不同。在第一种情况下,执行
sendRedirect
和异常,而在后一种情况下,仅引发异常,但忽略
sendRedirect
。显然,本地开发服务器和生产服务器有不同的实现。由于该标准没有定义这种情况,所以实现者可以根据自己的需要自由地实现它。这种情况经常发生。