前言
在 Web
开发中, 我们经常会需要处理各种异常, 这是一件棘手的事情, 对于很多人来说, 可能对异常处理有以下几个问题:
- 什么时候需要捕获(
try-catch
)异常, 什么时候需要抛出(throws
)异常到上层. - 在
dao
层捕获还是在service
捕获, 还是在controller
层捕获. - 抛出异常后要怎么处理. 怎么返回给页面错误信息.
异常处理反例
既然谈到异常, 我们先来说一下异常处理的反例, 也是很多人容易犯的错误, 这里我们同时讲到前端处理和后端处理 :
捕获异常后只输出到控制台
前端代码
$.ajax({
type: "GET",
url: "/user/add",
dataType: "json",
success: function(data){
alert("添加成功");
}
});
后端代码
try {
// do something
} catch (Exception e) {
e.printStackTrace();
}
那么用户看到的场景就是点击了添加按钮, 但没有任何反应(其实是返回了 500 错误页面, 但这里前端没有监听 error 事件, 只监听了 success 事件. 但即使加上了error: function(data) {alert("添加失败");}
) 又如何呢? 到底因为啥失败了呢, 用户也不得而知.这是见过最多的异常处理方式了, 如果这是一个添加商品的方法, 前台通过 ajax 发送请求到后端, 期望返回 json 信息表示添加结果. 但如果这段代码出现了异常:
- 后台
e.printStackTrace()
打印在控制台的日志也会在漫漫的日志中被埋没, 很可能会看不到输出的异常. 但这并不是最糟的情况, 更糟糕的事情是连e.printStackTrace()
都没有,catch
块中是空的, 这样后端的控制台中更是什么都看不到了, 这段代码会像一个隐形的炸弹一样一直埋伏在系统中.
混乱的返回方式
前端代码
$.ajax({
type: "GET",
url: "/goods/add",
dataType: "json",
success: function(data) {
if (data.flag) {
alert("添加成功");
} else {
alert(data.message);