Java框架搭建

第十四篇:全局异常处理

2018-07-13  本文已影响31人  __y

我们知道项目运行的过程中会出现一些问题如网络异常,服务器等问题。当出现异常的时候,我们往往在Controller就捕获处理了,我们有那么多Controller。这样非常不利于我们的发展
处理思路如下:
当请求过来的时候先经过前端控制器,前端控制器将请求交给Controller,Controller将请求交给Service,Service交给Dao。Dao处理完后,将处理结果返回给Service,Service再讲返回结果返回给Controller,Controller再将返回的结果返回给前端控制器。同理,如果系统出现异常的话,最终也会传到前端控制器。我们便在前端控制器对异常进行统一处理~


image.png
image.png

我们还需要在src/main/resources目录下放置log4j.properties文件。

public class GlobalExceptionResolver implements HandlerExceptionResolver {

    private final static Logger logger = LoggerFactory.getLogger(GlobalExceptionResolver.class);
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {
        logger.info("进入全局异常处理");
        logger.debug("测试handler的类型" + handler.getClass());
        //控制台打印异常
        e.printStackTrace();
        //向日志中写入日志
        logger.error("系统异常",e);
        //发送邮件
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try{
                    SendMail.sendMail("搜索系统出现异常,请及时处理", StackTrace.getStackTrace(e));
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
        };
        //发送短信
        //显示错误界面
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message","系统异常,请稍后操作");
        modelAndView.setViewName("error/exception");
        return modelAndView;
    }
}

在Springmvc.xml中


image.png

全局异常就配好了

2.发送邮件

image.png

前面我们看到有一个发送邮件的线程代码,下面把代码黏贴出来
之前用的是163测试结果一直不过,换了QQ就好了。所以最好我们用QQ邮箱去进行发送的测试(不过获得qq邮箱的授权码好麻烦。。)

/**
 * 发送邮件工具类
 */
public class SendMail {

    public static void sendMail(String subject,String text) throws MessagingException {
        //获取系统的属性
        Properties properties = new Properties();

        //设置服务器访问的协议
        properties.setProperty("mail.transport.protocol", "smtp");
        // 主机名
        properties.put("mail.smtp.host", "smtp.qq.com");
        // 端口号
        properties.put("mail.smtp.port", 465);
        //访问smtp服务其需要验证
        properties.setProperty("mail.smtp.auth","true");
        //设置是否使用ssl安全连接  ---一般都使用
        properties.put("mail.smtp.ssl.enable", "true");
        //获取session对象
        Session session = Session.getDefaultInstance(properties);
        //打开debug功能
        session.setDebug(true);
        //创建一个默认的MimeMessage对象
        Message msg = new MimeMessage(session);
        //这里填你登录qq邮箱所用的用户名
        msg.setFrom(new InternetAddress("XXXXXXXXXX@qq.com")); //设置发件人,163邮箱要求发件人与登录用户必须一致(必填),其它邮箱不了解

        msg.setSubject(subject);
        //设置邮件内容
        msg.setText(text);

        Transport trans = session.getTransport();
        //第一个参数填你的邮箱,第二个参数填你的授权码
        trans.connect("XXXXXXX@qq.com","XXXXXXXXXXX");
        //要发送到哪个邮箱,这里以163邮箱为例
        trans.sendMessage(msg, new Address[]{new InternetAddress("XXXXXX@163.com")}); //发送邮件

        trans.close(); //关闭连接

    }
}

StackTrace

/**
 * 将异常栈的信息转换为字符串
 */
public class StackTrace {
    public static String getStackTrace(Throwable aThrowable) {
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        aThrowable.printStackTrace(printWriter);
        return result.toString();
    }

}

上一篇下一篇

猜你喜欢

热点阅读