服务器错误导致HTTP 500响应客户端,并显示一般错误消息(“服务器遇到错误...”)。有没有办法拦截这条消息并写一个自定义的消息?
我希望能够从客户端唯一地识别服务器错误。如果我可以生成一个GUID,我在服务器端出现服务器错误,然后将该ID发送到客户端,这样可以在以后的任何时间点在日志中轻松搜索该特定异常。
我确实意识到服务器错误是由代码中的异常生成的,所以我在app引擎API中寻找某种捕获所有异常挂钩。当然,如果存在这样的钩子,并且在这里执行的代码会产生第二个异常,则必须再次默认为常规500错误。
我正在使用Java API for GAE
答案 0 :(得分:2)
对于GAE生成的错误,您可以configure a custom error page。对于代码生成的错误,您应该在第一个servlet过滤器中使用catch-all包装器。
答案 1 :(得分:1)
我最后按照this SO question中的答案编写了一个Servlet过滤器。过滤器将doFilter()
调用包装在一般的try-catch块中,并在将其记录在服务器上时为客户端创建一个引用号。我认为这个小片段可能对其他人有用:
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>
答案 2 :(得分:0)
你没有提到你是否使用python或java。 Python错误显示https://developers.google.com/appengine/docs/python/config/appconfig#Custom_Error_Responses
请注意,这些只是在发生任何未捕获错误时显示的静态页面。
您可以尝试在主处理程序中捕获这些错误(我在谈论python),但您不能总是这样。例如,您可能有时会捕获DeadlineExceededError,并且您可能只有很短的时间来发送日志或重定向(可能会在同一页面上再次尝试或者您自己的静态页面,并使用arg您提到的GUID,然后有javascript渲染它一些有用的方式)但通常这将无法正常工作。所以它在很大程度上取决于错误的性质。