是否可以在App Engine(GAE)上显示自定义500错误?

时间:2013-04-18 14:08:02

标签: java google-app-engine

服务器错误导致HTTP 500响应客户端,并显示一般错误消息(“服务器遇到错误...”)。有没有办法拦截这条消息并写一个自定义的消息?

我希望能够从客户端唯一地识别服务器错误。如果我可以生成一个GUID,我在服务器端出现服务器错误,然后将该ID发送到客户端,这样可以在以后的任何时间点在日志中轻松搜索该特定异常。

我确实意识到服务器错误是由代码中的异常生成的,所以我在app引擎API中寻找某种捕获所有异常挂钩。当然,如果存在这样的钩子,并且在这里执行的代码会产生第二个异常,则必须再次默认为常规500错误。

我正在使用Java API for GAE

3 个答案:

答案 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渲染它一些有用的方式)但通常这将无法正常工作。所以它在很大程度上取决于错误的性质。