§全局异常处理器 Exception Handler

jetbrick 提供了一个全局的 Exception Handler 来处理所有的 Action/Result/View/Interpector 相关的错误。

要实现全局的异常处理器,主要实现 ExceptionHandler 接口即可。

§1. 新建一个 GlobalExceptionHandler.java 文件

package jetbrick.docs.samples;

import jetbrick.web.mvc.ExceptionHandler;

public class GlobalExceptionHandler implements ExceptionHandler {

  @Override
  public void handleError(RequestContext ctx, Throwable e) throws Throwable {
    if (ServletUtils.isAjaxRequest(ctx.getRequest()) {
      JSONObject json = new JSONObject();
      json.put("succ", false);
      json.put("message", e.getMessage());
      ctx.handleResult(JSONAware.class, json);
    } else {
      if (e instanceof WebNotFoundException) {
        ctx.handleResult("/error/404.jsp");
      } else if (e instanceof WebForbiddenException) {
        ctx.handleResult("/error/403.jsp");
      } else {
        ctx.handleResult("/error/500.jsp");
      }
    }
  }
}

§2. 配置 jetbrick-webmvc.properties

web.exception.handler = jetbrick.docs.samples.GlobalExceptionHandler

§3. 新建 /error/500.jsp 等页面

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

<%
    Throwable e = (Throwable) request.getAttribute(jetbrick.web.mvc.ExceptionHandler.KEY_IN_REQUEST);

    String message = "";
    java.io.ByteArrayOutputStream ostr = new java.io.ByteArrayOutputStream();

    if (e != null) {
        message = e.getMessage();
        e.printStackTrace(new java.io.PrintStream(ostr));
    }

    // dump request info and exception into log file
    // send mail to admin
    // ...
%>

<pre><xmp><%=ostr%></xmp></pre>

经验

我们可以通过全局的异常处理器来处理一些服务端的未知异常,并保持现场出错信息到日志文件中,以方便分析,同时对于线上系统能及时的发送错误信息邮件给相关的管理员。

我们也可以在这里处理一些用户鉴权相关的异常,以及时通知用户未授权错误。