【问题标题】:Is it any way to display custom 500-errors on App Engine (GAE)?有没有办法在 App Engine (GAE) 上显示自定义 500 错误?
【发布时间】:2013-04-25 17:52:08
【问题描述】:
服务器错误导致 HTTP 500 响应客户端并带有一般错误消息(“服务器遇到错误...”)。有什么办法可以截获这条消息并编写一个自定义消息?
我想要一种方法来唯一地识别来自客户端的服务器错误。例如,如果我可以生成一个 GUID,我在服务器端发生服务器错误时记录该 GUID,然后将该 ID 发送到客户端,那么以后随时可以轻松地在日志中搜索该特定异常。
我确实意识到服务器错误是由代码中的异常产生的,因此我正在寻找应用引擎 API 中的某种捕获所有异常挂钩。当然,如果存在这样的钩子,并且此处执行的代码产生了第二个异常,则它必须再次默认为一般的 500 错误。
我正在为 GAE 使用 Java API
【问题讨论】:
标签:
java
google-app-engine
【解决方案2】:
我最终按照this SO question 中的答案编写了一个 Servlet 过滤器。过滤器将doFilter() 调用包装在一个通用的try-catch 块中,并在将客户端记录到服务器时为客户端创建一个参考号。我认为这个小 sn-p 可能对其他人有用:
public class ExceptionFilter implements Filter {
private FilterConfig filterConfig;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
try {
filterChain.doFilter(request, response);
}
catch (Exception ex) {
String errorId = UUID.randomUUID().toString();
Mylog.e("Server error " + errorId); // Use whatever logging mechanizm you prefer
String clientResponse = "Server error. Reference no: " + errorId;
((HttpServletResponse) response).setStatus(500);
response.getWriter().write(clientResponse);
}
}
public FilterConfig getFilterConfig() {
return filterConfig;
}
public void init(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
public void destroy() {}
}
您还需要像这样配置 web.xml(在 <web app> 标签下的某处):
<filter>
<filter-name>ExceptionFilter</filter-name>
<filter-class>your.package.ExceptionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ExceptionFilter</filter-name>
<servlet-name>Your Servlet Name As Defined In servlet-mapping</servlet-name>
</filter-mapping>