如何使用HandlerExceptionResolver不打印异常

时间:2015-03-17 10:28:15

标签: java spring-mvc exception web

public class AtrExceptionResolver implements HandlerExceptionResolver {
private final static Log log =LogFactory.getLog(AtrExceptionResolver.class);

@Override
public ModelAndView resolveException(HttpServletRequest request,
        HttpServletResponse response, Object handler, Exception ex) {
    boolean ajaxrequest = false;
    if (request.getRequestURI().indexOf("/ajax/") > 0)
        ajaxrequest = true;
    if (ex instanceof AtrException) {
        AtrException atrE = (AtrException) ex;
        log.error(
                "AtrException:code:" + atrE.getCode() + ",desc:"
                        + atrE.getMsg(), ex);
        if (ajaxrequest) {
            PrintWriter out = null;
            try {
                out = response.getWriter();
                out.print("{\"e\":\"" + atrE.getCode()
                        + "\",\"message\":\"" + atrE.getMsg() + "\"}");
                out.flush();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                out.close();
            }
        } else {
            try {
                goToError(request, response);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    } else {
        log.error("Exception:desc:" + ex.getMessage(), ex);
        if (ajaxrequest) {
            PrintWriter out = null;
            try {
                out = response.getWriter();
                out.print("{\"e\":\"3\",\"message\":\"system error\"}");
                out.flush();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                out.close();
            }
        } else {
            try {
                goToError(request, response);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    return null;

}

private void goToError(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    response.sendRedirect(request.getContextPath() + "/jsp/error.jsp");
}

atrException由我自己定义,所以我不想在console.inly中将printStackTrace()打印在日志中。 我调试它,发现它是通过standardwrappervalve.invoke()打印的。 如何在控制台中不打印atrException消息?

2 个答案:

答案 0 :(得分:0)

如果我理解了您的问题,那么您需要在String对象中使用异常堆栈跟踪,您可以将其用于记录。

您可以使用以下方法。

public String getErrorLog(Throwable throwable) {
    if (throwable != null) {
        StringWriter errors = new StringWriter();
        throwable.printStackTrace(new PrintWriter(errors));
        return errors.toString();
    }
    return "";
}

返回值是可以记录的堆栈跟踪。

答案 1 :(得分:-2)

return new ModelAndView();

这种方式可以解决。