【问题标题】: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


【解决方案1】:

对于 GAE 生成的错误,您可以configure a custom error page。对于代码生成的错误,您应该在第一个 servlet 过滤器中使用包罗万象的包装器。

【讨论】:

  • 什么是第一个 servlet 过滤器?
【解决方案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>

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 2017-12-25
      • 2021-12-29
      相关资源
      最近更新 更多