文章目录
- 一、引言
- 1、应用场景
- 2、语法
- 3、体系
- 二、详细设计(后端开发)
- 1、信息提示常量类
- 2、自定义异常
- 3、Model层
- 4、Controller层
- 5、View层
一、引言
编程也有很久的时间了,如果每个报的错误和寻找的答案写成一张纸,叠加起来也得有三层楼那么高了,当然在学习了Java之后这样的现象有所缓解。
回想起三年前学习Java,第一天学习到的与C语言有所不同的知识里,就有一个特殊机制异常处理机制。他的主要作用是加强程序的健壮性
1、应用场景
异常:程序执行过程中的不正常情况。
(例)
- 数据类型的转换
(当你希望他能够按照提醒输入时,你的反应:爱了爱了,真听话)
(他:我就不,我就不,略略略。你:…)
(遇到这种情况,初学者是怎么解决?)
我加了一个初学者,他说将输入Float类型换为String类型进行切割,得到String类型数组然后转为Char数组,最后进行Ascll表比对?
这个方法确实没错,但是是不有点麻烦,使得内存使用过多,且代码复杂。如果需求再复杂一点,是不是代码可读性就直线下降?如果需求添加(可以计算公式a+a=2a)是不是代码可维护性又下降了?是不是就使得代码失去了健壮性?
(使用了异常处理机制之后)
2、语法
try {
// 认为可能会出现错误的代码
} catch (Exception e) {
// 异常处理 提示 其他的操作
}
3、体系
二、详细设计(后端开发)
1、信息提示常量类
用于返回异常结果
public class MessageConstant {
public static final String PASSWORD_ERROR = "密码错误";
public static final String ACCOUNT_NOT_FOUND = "账号不存在";
public static final String ACCOUNT_LOCKED = "账号被锁定";
public static final String FILE_MOVE_ERROR_URL = "文件路径错误";
public static final String FILE_MOVE_ERROR_NAME = "文件夹名不能为空";
public static final String FILE_MOVE_ERROR_USER = "非本人操作";
public static final String FOLDER_ADD_ERROR = "文件夹创建失败";
public static final String FOLDER_ADD_ERROR_NO = "文件名存在违禁字符";
public static final String FOLDER_ADD_ERROR_GS = "文件夹格式错误";
public static final String FOLDER_ADD_ERROR_CF = "文件夹重复";
public static final String FOLDER_ADD_REPEAT_ERROR = "文件名存在";
}
2、自定义异常
/**
* 文件创建异常 error
*/
public class FileException extends BaseException{
public FileException() {}
public FileException(String msg) {
super(msg);
}
}
3、Model层
以我写的云盘项目中创建文件为例
@Override
public void insertFolder(AddFolderDto addFolderDto) {
// 判断是否为合法路径
if (addFolderDto.getUrl().equals(null)) {
throw new FileException(MessageConstant.FILE_MOVE_ERROR_URL);
}
// 文件夹名不为空
if (addFolderDto.getName().equals(null)) {
throw new FileException(MessageConstant.FILE_MOVE_ERROR_NAME);
}
// 判断文件名是否合法
for (int i = 0;i < FileUtil.NO.length;i++) {
if (addFolderDto.getName().contains(FileUtil.NO[i])) {
throw new FileException(MessageConstant.FOLDER_ADD_ERROR_NO);
}
}
if (addFolderDto.getName().split("\\.").length > 1) {
throw new FileException(MessageConstant.FOLDER_ADD_ERROR_GS);
}
if (fileMapper.selectByFolderName(addFolderDto.getName()) != null) {
throw new FileException(MessageConstant.FOLDER_ADD_ERROR_CF);
}
fileMapper.insertFolder(addFolderDto);
}
可能上面会有点看不懂,再看一个登录异常
@Override
public User login(User user) {
User u = userMapper.login(user.getEmail());
// 1、账号不存在
if (u == null) {
throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
}
// too 密码加密验证
String key = playFairUtil.Encryption(PlayFairKey.KEY, user.getPass());
// 2、密码错误
if (!key.equals(u.getPass())) {
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
// 3、账号锁定
if (Integer.valueOf(u.getStatus()) == 0) {
throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
}
return u;
}
4、Controller层
@PostMapping("/login")
@ApiOperation("用户登录")
public Result<UserLoginVO> login(User user) {
log.info("用户登录(邮箱):{}", user.getEmail());
User u = userService.login(user);
//登录成功后,生成jwt令牌
Map<String, Object> claims = new HashMap<>();
claims.put(JwtClaimsConstant.EMP_ID, u.getId());
String token = JwtUtil.createJWT(
jwtProperties.getAdminSecretKey(),
jwtProperties.getAdminTtl(),
claims);
log.info("jwt令牌:{}", token);
UserLoginVO userLoginVO = UserLoginVO.builder()
.id(u.getId())
.userName(u.getName())
.image(u.getImage())
.token(token)
.build();
return Result.success(userLoginVO);
}
5、View层
- AccountNotFoundException
- PasswordErrorException
- AccountLockedException
- FileException