Spring MVC 入门指南(十):异常处理

在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的。那么如何保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容—>异常处理。

我们就可以借助@ExceptionHandler注解来实现零配置的异常捕捉和处理。

首先,在我们项目的包com.ray.controllers中为controller建立一个父类BaseController,内容如下:

/**
 * @author Ray
 * @date 2018/4/21 0021
 */
public abstract class BaseController {

    @ExceptionHandler
    public String exception(HttpServletRequest request, Exception e){

        //添加自己的异常处理逻辑,如日志记录
        request.setAttribute("exceptionMessage", e.getMessage());

        //根据不同的异常类型进行不同处理
        if(e instanceof SQLException){
            return "sqlerror";
        }else{
            return "error";
        }
    }
}

其次,修改项目中IndexController让它继承于BaseController以便进行测试:

package com.ray.controllers;

import com.ray.auth.AuthPassport;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.sql.SQLException;

/**
 * @author Ray
 * @date 2018/4/21 0021
 */
@Controller
public class IndexController extends BaseController{

    @RequestMapping(value = "/hello")
    public ModelAndView index() throws SQLException {

        //测试
        throw new SQLException("数据库异常..");

    }
}

最后,在views文件夹中添加sqlerror.jsp视图来显示错误信息:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <base href="<%=basePath%>">
    <title>Insert title here</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
</head>
<body>
    ${exceptionMessage}
</body>
</html>

运行项目:


可以看到异常已经被捕捉并显示,这样只要把我们的其它的Controller全部继承于BaseController就能实现异常的集中捕捉和处理了。

猜你喜欢

转载自blog.csdn.net/q343509740/article/details/80026491