问答平台(3),统一处理异常

统一处理异常

统一处理异常-图示

1
2
3
4
5
6
7
8
9
@ControllerAdvice
- 用于修饰类,表示该类是 Controller 的全局配置类。
- 在此类中,可以对 Controller 进行如下三种全局配置:异常处理方案、绑定数据方案、绑定参数方案。
@ExceptionHandle(已使用)
- 用于修饰方法,该方法会在 Controller(出现异常后)被调用,用于处理捕获到的异常。
@ModelAttribute(未使用)
- 用于修饰方法,该方法会在 Controller(方法执行前)被调用,用于为 Model 对象绑定参数。
@DataBinder(未使用)
- 用于修饰方法,该方法会在 Controller(方法执行前)被调用,用于绑定参数的转换器。

表现层

1
2
3
4
5
6
7
8
9
10
// HomeController.java
@RequestMapping(path = "/error", method = RequestMethod.GET)
public String getErrorPage() {
return "/error/500";
}
// 拒绝访问时的提示页面
@RequestMapping(path = "/denied", method = RequestMethod.GET)
public String getDeniedPage() {
return "/error/404";
}

制造异常

  • 普通请求
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    // MessageController.java
    @RequestMapping(path = "/letter/list", method = RequestMethod.GET)
    public String getLetterList(Model model, Page page) {
    // 制造异常
    Integer.valueOf("abc");

    User user = hostHolder.getUser();
    // 分页信息
    page.setLimit(5);
    page.setPath("/letter/list");
    page.setRows(messageService.findConversationCount(user.getId()));

    // 会话列表
    List<Message> conversationList = messageService.findConversations(
    user.getId(), page.getOffset(), page.getLimit());
    List<Map<String, Object>> conversations = new ArrayList<>();
    if (conversationList != null) {
    for (Message message : conversationList) {
    Map<String, Object> map = new HashMap<>();
    map.put("conversation", message);
    map.put("letterCount", messageService.findLetterCount(message.getConversationId()));
    map.put("unreadCount", messageService.findLetterUnreadCount(user.getId(), message.getConversationId()));
    int targetId = user.getId() == message.getFromId() ? message.getToId() : message.getFromId();
    map.put("target", userService.findUserById(targetId));
    conversations.add(map);
    }
    }
    model.addAttribute("conversations", conversations);

    // 查询未读消息数量
    int letterUnreadCount = messageService.findLetterUnreadCount(user.getId(), null);
    model.addAttribute("letterUnreadCount", letterUnreadCount);
    int noticeUnreadCount = messageService.findNoticeUnreadCount(user.getId(), null);
    model.addAttribute("noticeUnreadCount", noticeUnreadCount);

    return "/site/letter";
    }
  • 异步请求
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // MessageController.java
    @RequestMapping(path = "/letter/send", method = RequestMethod.POST)
    @ResponseBody
    public String sendLetter(String toName, String content) {
    // 制造异常
    Integer.valueOf("abc");

    User target = userService.findUserByName(toName);
    if (target == null) {
    return CommunityUtil.getJSONString(1, "目标用户不存在!");
    }

    Message message = new Message();
    message.setFromId(hostHolder.getUser().getId());
    message.setToId(target.getId());
    if (message.getFromId() < message.getToId()) {
    message.setConversationId(message.getFromId() + "_" + message.getToId());
    } else {
    message.setConversationId(message.getToId() + "_" + message.getFromId());
    }
    message.setContent(content);
    message.setCreateTime(new Date());
    messageService.addMessage(message);

    return CommunityUtil.getJSONString(0);
    }

异常处理

  • 包: controller -> advice
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // ExceptionAdvice.java
    @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");
    }
    }
    }

页面

  • 404.html
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <!doctype html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="icon" href="/img/logo.png"/>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous">
    <link rel="stylesheet" th:href="@{/css/global.css}"/>
    <title>问答社区-404</title>
    </head>
    <body>
    <div class="nk-container">
    <!-- 头部 -->

    <!-- 内容 -->
    <div class="main">
    <div class="container pl-5 pr-5 pt-3 pb-3 mt-3 mb-3">
    <img th:src="@{/img/404.png}">
    </div>
    </div>

    <!-- 尾部 -->
    </body>
    </html>
  • 500.html
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <!doctype html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="icon" href="/img/logo.png"/>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous">
    <link rel="stylesheet" th:href="@{/css/global.css}"/>
    <title>问答社区-500</title>
    </head>
    <body>
    <div class="nk-container">
    <!-- 头部 -->

    <!-- 内容 -->
    <div class="main">
    <div class="container pl-5 pr-5 pt-3 pb-3 mt-3 mb-3">
    <img th:src="@{/img/error.png}">
    </div>
    </div>

    <!-- 尾部 -->
    </body>
    </html>

问答平台(3),统一处理异常
https://lcf163.github.io/2020/05/18/问答平台(3),统一处理异常/
作者
乘风的小站
发布于
2020年5月18日
许可协议