第十四篇:全局异常处理
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();
}
}