出现的场景。
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的条件,结果就是抛了异常,却一次重试都没有。