虽然现在只是初入职场的IT小菜鸟,但是希望记录下自己工作中的点滴想法,分享给同在挣扎的各位菜鸟,也希望抛砖引玉,得到高手的指正。
阅读对象:对JAVA异常处理的用法略有知晓但对其用途比较模糊的新手们,也包括百度Google上无意中搜到了各位朋友,谢谢支持![零] 它躲在角落哭泣
JAVA中异常处理恐怕大家都是耳熟能详了。特别得益于是如今Eclipse等IDE工具的强大,一个简单的代码辅助就可以轻而易举的去掉那些编译期异常给大家编程环境中带来的那一串红色的报错提示。
try{
//do sth
}catch(Exception e){
e.printStackTrace();
}
是不是觉得无比方便?之前在刚学JAVA,甚至在学校里用JAVA做了不少大大小小的开发后,对异常处理一直都是这样一个态度:
既然IDE让我try-catch一下,那我就勉为其难try一下吧,要不然java死命报错不编译,我可奈何不了...
异常处理他表示很伤心..因为,如果你真像我这么想,你就完全误解他了。
因为他是为你服务的,而不是给你找麻烦的,只是在于,你懂不懂他的服务方式。
[壹] 程序源于生活,异常无处不在
我一直相信,程序都是来源于生活,一定可以在生活中找到例子。嘿,异常处理的例子也被我找到了,恭喜我吧!
比如,你是一位正在学习美术手绘的学生。
你手上拿着铅笔,准备依次画5张画。
你画着画着,突然铅笔芯断了——但你不急不慢地拿起小刀把铅笔削好。
然后,你继续把后面的画画完。
for( draw 5 times ){
try{
draw();
}catch(PencilBrokenException e){
sharpenPencil();
}
}
是不是觉得异常处理好像做了点什么事?
[贰] 从生活再回到程序员的世界
举例归举例,归根结底还是要能在程序中灵活运用,所以那就让我们回到看着满屏幕代码的状态,来想想异常处理究竟能带来什么好处?
[贰·一] 何为异常处理
异常处理,顾名思义,分为两个阶段:发现(捕获)异常 ---> 处理异常
关键点在于:发现异常了,要处理。
再次强调: 不管以何种方式来处理,总之,你必须要去处理它!(之后我们再讨论怎么处理合理)
[贰·二] 异常处理的目的
如果大家也像我之前所说的那样,只是简单的而用IDE工具的快捷键生成一个e.printStackTrace();
那确实这样你很难体会到异常处理的用途所在,所以我们需要明确:
异常处理的目的在于:对于try中抓住异常之后,要想办法解决这个问题,如果不解决,那捕获有什么意义呢?
我们不能说e.printStackTrace是没用的,它会打印出异常的堆栈信息,让你能够很快定位到错误的所在代码行。但并不算严格的“处理”。
[贰·三] 异常处理的方式
异常有两种处理方式,很幸运,又和生活中那么相似:
1. catch后直接处理 —— 铅笔芯断了,我自己会处理,削尖就OK了。
2. catch后抛出去 —— 突然画板坏了,自己不可能修好,只能去向老师说明了,让他处理接下来的事了。
catch(Exception e){
//throw e
throw new YourOwnException();
}
这两种方式的关键不同在于:
方式①可以处理完后继续做接下来的事,整个程序会继续按照流程进行;
方式②则会在在抛出异常之后让程序中断在此处
[贰·四] 合理使用不同的处理方式
好了,知道了两种方式的异同点,就可以来根据需要来合理选择自己业务处理中所需要的异常处理方式了。
1. 如果需要让本方法完全按照既定流程走完,那就选择方式①,就像之前列举的画画的例子一样,即使中途笔断了,削尖之后继续完成之后的绘画;
2. 如果本方法无法对此处理,或者按照业务流程的规定在此处若发生异常,必须终止之后的流程,那则必须将异常抛出,如购买商品,获取商品信息时便出现了错误,则之后的下单支付流程肯定是要被提前终止的。
[叁] 百闻不如一见
好了,说了这么多,来举个例子吧:
业务背景:你需要从一个服务器上下载N个xml文件,将这些xml中所记录的订单数据依次录入到数据库中。
设计流程:创建连接 --> 下载文件 --> 解析文件与录入数据
异常处理:创建连接失败 —— 整个流程终止(因为无法下载文件进而无法录入数据,再往后执行没有意义)
下载单个文件失败 —— 进行异常处理后继续其他文件的下载 (无法保证每个文件都链接正常,网络链接闪断是经常出现的情况,所以程序不能终止)
解析文件和录入数据失败 —— 进行异常处理后继续继续解析其他文件 (无法保证每个文件的格式规范以及数据库链接的绝对稳定,所以中途解析录入失败也不能终止)
public void doservice() throws Exception{
try{
connectFTP();
}catch(ConnectException e){
//你可以考虑在用日志进行异常记录,便于系统运行维护
//处理完毕之后,抛出异常,因为流程必须要终止
throw e;
}
String[] fileNames = getFileNameArray();
for(...){
try{
downloadFile(fileNames[i]);
}catch(DownFileException e){
//你可以考虑在用日志进行异常记录,便于系统运行维护
//处理完毕之后,不抛出异常,因为流程需要继续
}
}
String[] downSuccessFileNames = getdownSuccessFileNameArray();
for(...){
try{
analyseFile(downSuccessFileNames[i]);
}catch(ParseFileException e){
//你可以考虑在用日志进行异常记录,便于系统运行维护
}catch(DBException e){
//对于大型的企业级应用,往往会有平台监控系统
//类似于此处发生的与数据库访问出现的系统级错误,可以在此处加入监控系统的记录代码
}
}
}
[肆] 小结
好了,希望各位能够对异常处理有一个更直观的认识,说实在的,这些内容谈不上多高的技术含量,不过在平时的工作中实用性还是很强的。
不过异常处理的领域并不只有这些,下一篇博客中我会再谈谈我自己对自定义异常的一些分析,谈谈再看来,什么才应该作为一种“异常”。