安全编程之异常处理
最近在上有关安全编程的课程,整理一些课上笔记外加一些自己测试的东西写成学习博客,希望大家共同进步。
关于异常,大家早已熟知,那么异常是如何来的呢?
异常的起源
异常的起源据说是这样的。。。
相信大家都写过左边这样的代码:
int function(int a){ Object function(int a){
if(a>0||a<10){ if(a>0||a<10){
return 1; return a;
} }
return 0; return "范围错误";
} }
想当年的大牛想编写一个判断某个数是否在1-10这个范围内的函数,和左边不同的是如果范围正确,返回该数值,否则返回---“范围错误”。上面这个函数的返回值结果是int型的,但大牛的返回值结果既可能是int型也可能是一串字符,如果我们其他函数要用到这个结果,这种处理方式显然很不方便,于是大牛创造了异常。上面其实说的就是一个关于返回值的问题,遇到异常信息我们该怎么办。一句话:
一:避免用返回值存储异常信息,而采用Exception来包装异常。
int function(int a) throws Exception{
if(a<0||a>10){
throw new Exception("范围错误");
}
else
return a;
}
异常在函数之间是怎么传递的呢。。。。很简单,即异常的抛出以及捕获。。。某个函数如果产生某个异常,可以将其抛出,其他函数可以捕获。。。遇到某个可能抛出异常的函数fun()我们先善待try{fun()},不行之后就catch(Exception e);
int function(int a) throws Exception {
if (a < 0 || a > 10) {
throw new Exception("范围错误");
} else
return a;
}
void f() {
try {
function(80);
} catch (Exception e) {
e.printStackTrace();
}
}
当然,使用异常是需要一定代价的,不用说也知道,肯定是性能降低了。。。
当我们需要某段代码必须执行的时候,就可以用到finally,这样不管异常怎么阻碍或者其他某种原因,其中的代码总会执行。即在try,catch后面加上finally{}。
二:必须要执行的代码,一定要写在finally中才安全。
既然异常可以增加我们编程的安全性,那么
三:科学的使用自定义异常。
就像程序遇到bug突然崩溃要提交这个bug一样,根据异常我们可以将程序遇到的某个错误记录下来,这时候我们可以自定义一个异常。
public class CException extends Exception{
//日期和数值属性
Date time;
int num;
//属性的set和get方法
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public Date getTime() {
return time;
}
public void setTime(Date date) {
this.time = date;
}
}
然后我们在编写代码的时候可以抛出这个异常:
// 异常产地
int cal(int a) throws CException {
// GregorianCalendar的实例来找到执行的时间
GregorianCalendar cal = new GregorianCalendar();
if (a > 10 || a < 0) {
CException ce = new CException();
ce.setTime(cal.getTime());// 设置异常中的time属性
ce.setNum(a);// 设置异常中的num属性
throw ce;// 抛出异常
} else
return a;
}
void f() {
try {
cal(100);
} catch (CException ce) {// 捕获异常
System.out.println("在" + ce.getTime() + "這一時刻輸入了數字" + ce.getNum()+"遇到了异常");
}
}
结果如下:
在Tue May 07 20:37:38 CST 2013這一時刻輸入了數字100遇到了异常
有时候我们会遇到大量的异常,而且很多异常都是重复出现的,这个时候我们就可以将他们统统包括在Exception中抛出,然后统一解决。即
四:使用异常的集中处理
下面我定义了一个异常处理方法的类ExceptionHandle
//处理异常的类
public class ExceptionHandle{
//假设有两种异常情况
public static void Handle(Exception e){
if(e instanceof CException){
System.out.println("我是CException的处理方法");
}
if(e instanceof IOException){
System.out.println("我是IOException的处理方法");
}
}
}
遇到异常要处理时。
void f() {
try {
cal(100);
} catch (CException ce) {// 捕获异常
ExceptionHandle.Handle(ce);
}
}
结果:我是CException的处理方法
这样集中处理异常可以解决一些问题,如程序的条理性以及可读性等等,又例如A君写的程序已经上市,如果其中出现了某些问题异常问题,采用异常集中处理,可以直接写个配置文件补丁,就可以不更改已经写好的源程序。文艺一点就是使程序具有了更好的兼容性?(这是我瞎猜的。。。)。同时也更安全。
目前就整理笔记列出来四点,知识点比较简单,如有错误之处,请不吝赐教。。。