如何合理的在conntroller层处理系统异常和业务异常,举例说明
时间: 2024-02-16 12:03:20 浏览: 216
好的,我来举个例子。
假设我们有一个UserController,其中包含一个注册用户的接口registerUser,该接口需要传入用户名和密码。为了防止用户名重复,我们需要在该接口中处理业务异常。
首先,我们可以定义一个自定义异常类,比如UserExistException,用于表示用户名已存在的异常。该类可以继承RuntimeException,因为业务异常通常都是非受检异常。
```java
public class UserExistException extends RuntimeException {
public UserExistException(String message) {
super(message);
}
}
```
然后,在UserController中的registerUser方法中,我们可以使用try-catch语句来捕获该异常,并在发生异常时返回给前端一个友好的提示信息。
```java
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public String registerUser(@RequestParam("username") String username, @RequestParam("password") String password) {
try {
userService.registerUser(username, password);
return "注册成功";
} catch (UserExistException e) {
return "用户名已存在,请重新输入";
} catch (Exception e) {
return "系统繁忙,请稍后再试";
}
}
}
```
最后,在UserService中的registerUser方法中,我们可以判断用户名是否已存在,如果已存在,则抛出UserExistException异常。
```java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void registerUser(String username, String password) {
// 判断用户名是否已存在
User user = userRepository.findByUsername(username);
if (user != null) {
throw new UserExistException("用户名已存在");
}
// 注册用户
userRepository.save(new User(username, password));
}
}
```
这样,当用户输入已存在的用户名时,UserController会捕获UserExistException异常,并返回给前端一个友好的提示信息。而当发生其它系统异常时,UserController也会返回一个友好的提示信息,避免将异常信息暴露给前端用户,提高系统的安全性和用户体验。
阅读全文