1 统一异常处理
如果数据层有异常,就会抛给它的调用者业务层,业务层再抛给它的调用者表现层
无论是哪个层次的异常,都会汇到表现层,要对表现层统一处理异常
1.1 SpringBoot提供的方案
SpringBoot提供的方案:在特定路径上加上对应特定错误状态的页面(如:404,500),在发生该错误时就会自动转到起对应的页面
特定路径:templates目录下error文件夹,文件夹名一定要叫error,error下的文件名一定要是错误状态:404.html,500.html等) 这里注意:如果特定路径加了404.html,404时也不显示相应页面的话:删掉target文件夹重新编译就好了
1.2 Spring提供的方案
状态为500时,服务器需要打日志,页面需要更多提示信息,SpringBoot提供的方法不够用 本节我们利用ExceptionHandler统一处理所有可能的异常 1.在HomeController里提供访问500错误页面的方法
@RequestMapping(path = "/error",method = RequestMethod.GET)
public String getErrorPage(){
return "error/500";
}
2.在controller包下新建类ExceptionAdvice 路径如图:
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {
private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler({Exception.class})
public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
logger.error("服务器发生异常:" + e.getMessage());
for(StackTraceElement element : e.getStackTrace()){
logger.error(element.toString());
}
String xRequestedWith = request.getHeader("x-requested-with");
if("XMLHttpRequest".equals(xRequestedWith)){
response.setContentType("application/plain;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(CommunityUtil.getJSONString(1,"服务器异常"));
}else{
response.sendRedirect(request.getContextPath()+"/error");
}
}
}
2 统一记录日志
将日志写在Service里的话,万一要更改就很麻烦,如果将记录日志单独实现就会方便很多,AOP可以做到这一点 步骤: 1.加注解@Component 2.加注解@Aspect 3.声明切点
@Pointcut("execution(* com.nowcoder.community.service.*.*(..))")
public void pointcut(){ }
4.写具体要执行的操作
@Before("pointcut()")
public void before(){
System.out.println("before");
}
示例:
@Component
@Aspect
public class AlphaAspect {
@Pointcut("execution(* com.nowcoder.community.service.*.*(..))")
public void pointcut(){
}
@Before("pointcut()")
public void before(){
System.out.println("before");
}
@After("pointcut()")
public void after(){
System.out.println("after");
}
@AfterReturning("pointcut()")
public void afterReturning(){
System.out.println("afterReturning");
}
@AfterThrowing("pointcut()")
public void afterThrowing(){
System.out.println("afterThrowing");
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("around-before");
Object obj = joinPoint.proceed();
System.out.println("around-after");
return obj;
}
}
|