4

服务器错误导致 HTTP 500 响应客户端并带有一般错误消息(“服务器遇到错误...”)。有什么办法可以截获这条消息并编写一个自定义消息?

我想有一种方法来唯一地识别来自客户端的服务器错误。例如,如果我可以生成一个 GUID,我在服务器端发生服务器错误时记录该 GUID,然后将该 ID 发送到客户端,那么以后随时可以轻松地在日志中搜索该特定异常。

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

我正在为 GAE 使用 Java API

4

3 回答 3

2

对于 GAE 生成的错误,您可以配置自定义错误页面。对于代码生成的错误,您应该在第一个 servlet 过滤器中使用包罗万象的包装器。

于 2013-04-18T14:51:52.283 回答
1

我最终按照这个 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 app>您还需要像这样配置 web.xml(在标签下的某处):

<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>
于 2013-04-18T16:59:27.213 回答
0

你没有提到你使用的是python还是java。Python 错误显示https://developers.google.com/appengine/docs/python/config/appconfig#Custom_Error_Responses

请注意,这些只是在发生任何未捕获的错误时显示的静态页面。

你可以尝试在你的主处理程序中捕获这些错误(我说的是 python),但你不能总是这样。例如,您有时可能会捕获 DeadlineExceededError,并且您可能有一点时间来发出日志或重定向(可能到同一页面再试一次或到您自己的静态页面,带有 arg您提到的 GUID,然后让 javascript 以一些有用的方式呈现它)但通常这不起作用。所以这在很大程度上取决于错误的性质。

于 2013-04-18T15:47:46.607 回答