安全编程之异常处理

                                                                     安全编程之异常处理

 

              最近在上有关安全编程的课程,整理一些课上笔记外加一些自己测试的东西写成学习博客,希望大家共同进步。

             关于异常,大家早已熟知,那么异常是如何来的呢?

             异常的起源

             异常的起源据说是这样的。。。

             相信大家都写过左边这样的代码:

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君写的程序已经上市,如果其中出现了某些问题异常问题,采用异常集中处理,可以直接写个配置文件补丁,就可以不更改已经写好的源程序。文艺一点就是使程序具有了更好的兼容性?(这是我瞎猜的。。。)。同时也更安全。
                      目前就整理笔记列出来四点,知识点比较简单,如有错误之处,请不吝赐教。。。
             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值