1 异常
异常包含编译时异常和运行时异常,其中编译时异常也叫预期异常。运行时异常只有在项目运行的情况下才会发现,编译的时候不需要关心。
运行时异常,比如:空指针异常、数组越界异常,对于这样的异常,只能通过程序员丰富的经验来解决和测试人员不断的严格测试来解决。
编译时异常,比如:数据库异常、文件读取异常、自定义异常等。对于这样的异常,必须使用try catch代码块或者throws关键字来处理异常。
2 异常处理
系统的dao、service、controller出现的异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器HandlerExceptionResolver进行异常处理。
全局范围只有一个异常处理器。
2.1 自定义异常类
public class MyException extends Exception {
private String message;
public MyException(String message){
super(message);
this.message =message;
}
public MyException(String message,Throwable e){
super(message,e);
this.message = message;
}
public MyException(Exception e){
message =e.getMessage();
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.2 定义异常处理器
@Component
public class MyExceptionResolver implements HandlerExceptionResolver {
Logger logger = Logger.getLogger(MyException.class);
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) {
MyException myException = null;
if (e instanceof MyException ){
myException = (MyException)e;
}else {
myException = new MyException(e);
}
logger.error(myException.getMessage(),myException);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message",myException.getMessage());
// 设置错误页面
modelAndView.setViewName("error");
return modelAndView;
}
}
2.3 错误页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>error</title>
</head>
<body>
${message}
</body>
</html>
2.4 测试
@Controller
public class ExceptionTest {
@RequestMapping("et1")
public void et1() throws Exception{
String src ="target/classes/com/cc/pojo/User.class";
String des="target/classes/com/cc/pojo/Test.class";
RandomAccessFile r1 = new RandomAccessFile(src,"r");
RandomAccessFile r2 = new RandomAccessFile(des,"rw");
byte[] bytes = new byte[1024];
int len = 0;
//将src内容连接到des文件末尾
r2.seek(r2.length());
while ((len = r1.read(bytes))!=-1){
r2.write(bytes,0,len);
}
r1.close();
r2.close();
}
}