正确使用try catch

说道try catch,在代码质量把控不太严格的项目中经常会被滥用.这种情况也正说明了try catch的实用.当约了妹子的时候,try catch是最快捷的!!!(妹子呢???)

同样是catch异常,如果注意一些细节,使用正确的方法,会让结果更加完美.

方法一:

try catch块越小越好.

之前遇到过一个项目上的问题,正式版本的apk在深圳这边使用一切正常,但是俄罗斯的测试发现登陆账户后,app中所有页面都显示无网络.

因为异常情况一直无法复现,服务端和客户端排查了一周也未解决.后来使用了俄罗斯的VPN复现了该问题,发现服务端用户登录后返回的用户id有异常,并且客户端并未验证这个id的正确性就用作任何网络请求的基础参数.问题就出在基础参数上….写网络请求基本上都是会加一个大大的try catch,这样其中一步出异常,整个请求就终止了.

如果获取每个有风险的参数时,单独使用try catch就可以保证代码尽量运行正确.示例:

大范围catch:
try{
    ...
    baseParam.put(key1,value1)
    baseParam.put(key2,value2)
    baseParam.put(key3,value3)
    ...
}catch{

}

小范围catch:
try{
    ...
    baseParam.put(key1,getValue1())
    baseParam.put(key2,getValue2())
    baseParam.put(key3,getValue3())
    ...
}catch{

}

private  getValue1(){
    try{
        ...
        return value1
    }catch{}
    return default_value1
}
....

方法二:

异常需要处理

遇到过很多catch{}代码里面都是没有内容的,这意味着异常很可能没有真正的处理,只是规避了报错.

异常的处理需要根据具体情况.

方法三:

不处理的时候至少打印一个异常吧

调查问题的时候最怕的就是catch了异常没有打印堆栈.特别浪费时间.不过对于android开发,打印异常的时候最好加一个if debug.因为打印异常也是耗性能的,一大堆的字符串,如果是频繁的异常就非常耗性能.

以上.


更新日期:2017.8.23

effective java 第65条中也提到了不要忽略异常,深有同感,就是这里提到的方法三.当你调查一些诡异的问题时,最终发现,原来是一个异常被捕获了,并且没有打印异常栈,你也会深有同感.