try...catch执行了catch后不知道怎么重新执行业务?看这个~

出现的场景。

try…catch…是我们常用的用于处理运行错误的方法,比如IO流错误IOException,比如URL的异常ConnectException。那么在实际业务中(比如远程请求资源,却因为网络波动致使这次请求失败,从而走了catch,如果遇上了执行了catch后,依然希望重新执行try,需要如何做显然是头等大事。

如何来写。

先看一下我们常写的

try{
	//执行的代码
}catch(ConnectException ce){
	ce.printStackTrace();
}finally{
	//放一些不管什么情况下都要执行的代码,比如释放资源。
}

在上面的代码中,catch了,但是我们依然需要重新执行,那么可以这么改造

int flag = 0;
do{
	try{
		//执行的代码
		flag = 10;
	}catch(ConnectException ce){
		ce.printStackTrace();
		flag ++;
	}finally{
		//放一些不管什么情况下都要执行的代码,比如释放资源。
	}
}while(flag < 3);

套用循环,设置指标flag并赋值0。如果不走catch,那么flag = 10;反之则自增1。至于为什么用do{}while()循环而不是while循环,是因为do循环不管是否满足条件,do的内容都会执行一次。

为什么这么写。

那么问题来了,我为什么要这么写,而不是直接给个死循环。
问题在于,catch一旦执行,就会创建新的对象。大量的对象可能会造成内存溢出最终使得服务器瘫痪,所以使用flag做了重试的次数。以上面的例子,请求远程接口时网络波动了造成请求失败时,这样处理既不会对服务器内存造成太大的负担,又不会影响现有的业务。

如果有不正之处,欢迎各位的批评。如有改进之处,也欢迎大家的建议。

注意

flag = 10,在try里面无论如何也必须写在最下面。因为假如写在了上面或者中间,可能会导致还没到业务执行完的时候就对flag的值进行了变更,结果抛出异常,flag ++,那么flag会等于11,达不成while的条件,结果就是抛了异常,却一次重试都没有。

你可能感兴趣的:(JAVA,java)