参照案例,设计N个会出错的案例,使用errorPage转发至另-个解决错误的页面,并使用exception内置对象获取错误信息。
时间: 2024-11-04 17:16:28 浏览: 12
在Web应用开发中,我们常常需要处理可能出现的错误情况,并将用户导向到专门的错误处理页面。这里提供三个模拟的错误案例及如何通过Spring MVC的`errorPage`配置和`@ExceptionHandler`注解来处理:
**案例一:HTTP状态码404**
```java
@Controller
public class MyController {
@GetMapping("/nonexistent")
public String accessNonExistentResource() {
// 模拟资源不存在
throw new ResourceNotFoundException("Resource not found", HttpStatus.NOT_FOUND);
}
@ExceptionHandler(ResourceNotFoundException.class)
@RequestMapping(value = "/error", method = RequestMethod.GET)
public String handleResourceNotFoundError(Exception e) {
WebRequest request = (WebRequest) RequestContextHolder.getRequestAttributes();
Map<String, Object> model = new HashMap<>();
model.put("errorMessage", "对不起,您请求的资源未找到.");
model.put("errorDetails", e.getMessage());
return "errorPage", model;
}
}
```
在这个例子中,当访问非存在的资源时,`accessNonExistentResource`方法抛出`ResourceNotFoundException`,然后`handleResourceNotFoundError`方法捕获该异常,将其传入模型并返回一个自定义错误页面。
**案例二:业务异常**
```java
public class CustomBusinessException extends RuntimeException {
// ...
@ExceptionHandler(CustomBusinessException.class)
@GetMapping("/custom-error")
public String handleCustomBusinessError(CustomBusinessException e) {
ExceptionDetails exceptionDetails = ExceptionUtils.getStackTrace(e);
return "errorPage", Collections.singletonMap("errorMessage", "发生了一个内部错误.", "details", exceptionDetails);
}
}
// 使用时故意触发
@GetMapping("/throw-custom-error")
public void throwCustomError() {
throw new CustomBusinessException("这是一个自定义的业务异常");
}
```
这里定义了一个`CustomBusinessException`,并在特定URL路径上引发它,异常会被映射到相应的处理方法,显示详细的错误信息。
**案例三:数据库连接错误**
```java
@Autowired
private DataSource dataSource;
@GetMapping("/db-error")
public String dbConnectionError() {
try {
jdbcTemplate.queryForObject("invalid SQL query", String.class); // 明知无效的查询
} catch (DataAccessException dae) {
return "errorPage", mapDatabaseException(dae);
}
}
private Map<String, Object> mapDatabaseException(DataAccessException e) {
Map<String, Object> model = new HashMap<>();
model.put("errorMessage", "数据库连接错误");
model.put("errorDetails", e.getMessage());
return model;
}
```
这个示例中,如果SQL查询失败,`jdbcTemplate`会抛出`DataAccessException`,我们在`dbConnectionError`方法里捕获,然后返回错误页面。
每个案例都展示了如何通过Spring MVC的错误处理机制来定位问题、记录错误信息,并将用户引导至统一的错误页展示。
阅读全文