zoukankan      html  css  js  c++  java
  • 统一异常处理

    1.统一异常处理

    1.1 统一异常结果类型

    Java中进行异常处理:

    一类是可预知的异常,程序员在编码时,主动抛出的异常,为了给用户操作提示,提前检查代码中可能存在异常。

    通过开发中,采用自定义的异常类,每个异常类表示每一类异常信息。类需要继承Exception类。

    本系统采用统一异常类,提供一个属性标识异常类。

    另一类是不可预知异常,就是runtimeException异常,通过提高代码编写质量来避免此类异常,也可通过后期测试 人员进行系统功能测试对runtime异常进行避免。



    如何使用异常类?

    在service中要抛出此异常类。
    在action或者Controller中捕获系统自定义异常,解析系统自定义异常。

    解析系统自定义异常过程:

    如果抛出的ExceptionResultInfo系统自定义异常,直接获取该异常信息即可。

    如果不是抛出的ExceptionResultInfo系统自定义异常,重新构造一个“未知错误异常!”。



    将异常信息或成功信息返回到页面:

    统一使用类SubmitResultInfo,提交类的方法统一使用该类型作为返回值类型。



    由于action中所有的提交类方法统一返回SubmitResultInfo,所以在页面要统一使用一个方法解析json结果。



    修改回调函数:

    function sysusersave_callback(data){

    message_alert(data);

    1.2 统一异常处理器

    Springmvc提供统一处理器机制,springmvc的前端控制器在调用适配器,去调用action,过程中如果发生异常,前端控制器交给异常处理器进行异常处理。

    前端控制器源代码:

    1.2.1 自定义异常处理器流程

    对dao、service及action所抛出的异常进行统一处理,在action中就不需要添加try{}catch{}捕获的代码。

    1.2.2 自定义异常处理器编写

    自定义全局异常处理器,实现HandlerExceptionResolver接口

    public class ExceptionResolverCustom implements HandlerExceptionResolver {

    // json转换器

    // 将异常信息转json

    private HttpMessageConverter<ExceptionResultInfo> jsonMessageConverter;

    // 前端控制器调用此方法执行异常处理

    // handler,执行的action类就包装了一个方法(对应url的方法)

    @Override

    public ModelAndView resolveException(HttpServletRequest request,

    HttpServletResponse response, Object handler, Exception ex) {

    // 输出 异常信息

    ex.printStackTrace();

    // 转成springmvc底层对象(就是对action方法的封装对象,只有一个方法)

    HandlerMethod handlerMethod = (HandlerMethod) handler;

    // 取出方法

    Method method = handlerMethod.getMethod();

    // 判断方法是否返回json

    // 只要方法上有responsebody注解表示返回json

    // 查询method是否有responsebody注解

    ResponseBody responseBody = AnnotationUtils.findAnnotation(method,

    ResponseBody.class);

    if (responseBody != null) {

    // 将异常信息转json输出

    return this.resolveJsonException(request, response, handlerMethod,

    ex);

    }

    // 这里说明action返回的是jsp页面

    // 解析异常

    ExceptionResultInfo exceptionResultInfo = resolveExceptionCustom(ex);

    // 将异常信息在异常页面显示

    request.setAttribute("exceptionResultInfo",

    exceptionResultInfo.getResultInfo());

    // 转向错误页面

    ModelAndView modelAndView = new ModelAndView();

    modelAndView.addObject("exceptionResultInfo",

    exceptionResultInfo.getResultInfo());

    modelAndView.setViewName("/base/error");// 逻辑视图名

    return modelAndView;

    }

    // 异常信息解析方法

    private ExceptionResultInfo resolveExceptionCustom(Exception ex) {

    ResultInfo resultInfo = null;

    if (ex instanceof ExceptionResultInfo) {

    // 抛出的是系统自定义异常

    resultInfo = ((ExceptionResultInfo) ex).getResultInfo();

    } else {

    // 重新构造“未知错误”异常

    resultInfo = new ResultInfo();

    resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL);

    resultInfo.setMessage("未知错误!");

    }

    return new ExceptionResultInfo(resultInfo);

    }

    // 将异常信息转json输出

    private ModelAndView resolveJsonException(HttpServletRequest request,

    HttpServletResponse response, Object handler, Exception ex) {

    // 解析异常

    ExceptionResultInfo exceptionResultInfo = resolveExceptionCustom(ex);

    HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);

    try {

    //将exceptionResultInfo对象转成json输出

    jsonMessageConverter.write(exceptionResultInfo, MediaType.APPLICATION_JSON, outputMessage);

    } catch (HttpMessageNotWritableException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return new ModelAndView();

    }

    public HttpMessageConverter<ExceptionResultInfo> getJsonMessageConverter() {

    return jsonMessageConverter;

    }

    public void setJsonMessageConverter(

    HttpMessageConverter<ExceptionResultInfo> jsonMessageConverter) {

    this.jsonMessageConverter = jsonMessageConverter;

    }

    }

    1.2.3 统一异常处理器配置

    在springmvc.xml配置统一异常处理器。

    在web.xml中配置:

    前端控制器知道全局异常处理器id为handlerExceptionResolver

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>classpath:spring/springmvc.xml</param-value>

    </init-param>

    <init-param>

    <param-name>detectAllHandlerExceptionResolvers</param-name>

    <param-value>false</param-value>

    </init-param>

    </servlet>

    detectAllHandlerExceptionResolvers:

    屏蔽自动注册异常处理器,固定使用bean的id为handlerExceptionResolver的异常处理器。

    1.2.4 统一异常处理器使用

    系统中所有异常由全局异常处理器处理。

    Dao方法向外抛出系统自定义异常。

    Service方法向外抛出系统自定义异常。

    Action方法向外抛出系统自定义异常。

    1.2.5 统一异常处理器测试

    1、 在action的提交方法中发生异常,由全局异常处理器进行处理。

    2、在action返回jsp方法中发生异常,由全局异常处理器进行处理。

    转载请注明:http://www.xujin.org

  • 相关阅读:
    sql server 2008 express 安装的时提示“重启计算机失败"
    100个MySQL 的调节和优化的提示
    C#访问MySQL数据库的方法
    应用程序默认安装在C盘后启动时提示权限不足想起的。。。
    Visual Studio开发工具升级注意事项
    WPF:理解ContentControl——动态添加控件和查找控件
    django报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
    不错的后台模板
    allure官方文档
    Python requests.post方法中data与json参数区别
  • 原文地址:https://www.cnblogs.com/ACMer/p/4542204.html
Copyright © 2011-2022 走看看