专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » 以前的陋习: 6种异常处理的陋习 »正文

以前的陋习: 6种异常处理的陋习

来源: 发布时间:星期四, 2008年12月18日 浏览:2次 评论:0
你觉得自己是Java专家吗?是否肯定自己已经全面掌握了Java异常处理机制?在下面这段代码中你能够迅速找出异常处理 6个问题吗? prefix = o />JAVA中文站社区门户bIe3x\ [o*yuc)U

1 =SpellE>OutputStreamWriter out = ... JAVA中文站社区门户 p-X*wg1sv8vjEl]"D
2 =SpellE>java.sql.Connection =SpellE>conn = ...
8Rw)RTc[%e+}6pW+P3 try { // ⑸
'?SLD @@a!H4
 Statement stat = =SpellE>conn.createStatement; JAVA中文站社区门户G#l bQ)w%B&t#H[
5
 =SpellE>ResultSet =SpellE>rs = =SpellE>stat.executeQuery( JAVA中文站社区门户5w"z(A2@+E |
6
  'select =SpellE>uid, name from user'); JAVA中文站社区门户'OQl5n c`
7
 while (=SpellE>rs.next)
h+G S$E u)j$UWi8
 { JAVA中文站社区门户$F N2KWl:bP?
9
  =SpellE>out.prln('ID:' + =SpellE>rs.getString('=SpellE>uid') // ⑹ JAVA中文站社区门户 z'hf4|kd5[1E
10
   '姓名:' + =SpellE>rs.getString('name')); JAVA中文站社区门户0V6@Kt.mo@ k
11
 }
:V T&nyH3u/h12
 =SpellE>conn.close; // ⑶ JAVA中文站社区门户@/tpTH y
13
 =SpellE>out.close;
xQ1n%fq ~ |;r#U14 } JAVA中文站社区门户5v Q5N*H P t-EN ? c6p
15 catch(Exception ex) // ⑵
*q o&c7A yl16 {
P2l;Hl0k#Z&Yxm17
 =SpellE>ex.prStackTrace; //⑴
B,qM4kC c18 }


*Rd1@$C7\c5I V 作为Java你至少应该能够找出两个问题但是如果你不能找出全部 6个问题请继续阅读本文
^]\{ZTJAVA中文站社区门户T6I5zO:wx
  本文讨论不是Java异常处理般性原则这些原则已经被大多数人熟知我们要做是分析各种可称为反例(anti-pattern)违背优秀编码规范标准常见坏习惯帮助读者熟悉这些典型反面例子从而能够在实际工作中敏锐地察觉和避免这些问题

9{a0A)v3L9d)W  

!Ex%Upi tR&f 反例的:丢弃异常 JAVA中文站社区门户L*bB#q-yT:o"@
JAVA中文站社区门户0n3OjGV @
  代码:15-18 JAVA中文站社区门户;j3N'p Rw4^ OMt

8] c`:y#cT
  这段代码捕获了异常却不作任何处理可以算得上Java编程中杀手从问题出现频繁程度和祸害程度来看它也许可以和C/C个恶名远播问题相提并论??不检查缓冲区是否已满如果你看到了这种丢弃(而不是抛出)异常情况可以百分的 9十 9地肯定代码存在问题(在极少数情况下这段代码有存在理由但最好加上完整注释以免引起别人误解) JAVA中文站社区门户VH5wzU}#UO
JAVA中文站社区门户6\/y'|G4j{%[ r
  这段代码在于异常(几乎)总是意味着某些事情不对劲了或者说至少发生了某些不寻常事情我们不应该对发出求救信号保持沉默和无动于衷=SpellE>prStackTrace算不上处理异常不错=SpellE>prStackTrace对调试有帮助调试阶段结束的后=SpellE>prStackTrace就不应再在异常处理模块中担负主要责任了
P%l }(dW4xRQ5v
[*Cn*v+IQGlKGl
  丢弃异常情形非常普遍打开JDK=SpellE>ThreadDeath文档可以看到下面这段介绍说明:特别地虽然出现=SpellE>ThreadDeath正常情形=SpellE>ThreadDeath类是Error而不是Exception子类许多应用会捕获所有Exception然后丢弃它不再理睬这段话意思是虽然=SpellE>ThreadDeath代表种普通问题但鉴于许多应用会试图捕获所有异常然后不予以适当处理所以JDK=SpellE>ThreadDeath定义成了Error子类Error类代表应用不应该去捕获严重问题可见丢弃异常这坏习惯是如此常见它甚至已经影响到了Java本身设计
$rn%~CL
;g@2ANV^$w
  那么应该怎样改正呢?主要有 4个选择:
A4_UQ4u3KF
)h`&KLJ3_{
  1、处理异常针对该异常采取些行动例如修正问题、提醒某个人或进行其他些处理要根据具体情形确定应该采取动作再次介绍说明=SpellE>prStackTrace算不上已经处理好了异常 JAVA中文站社区门户5f[2d8Q1t,C:yT
JAVA中文站社区门户"sC-}{C,M0\8lIl _
  2、重新抛出异常处理异常代码在分析异常的后认为自己不能处理它重新抛出异常也不失为种选择
rp;i:T a
1~+@/MQM-k b
  3、把该异常转换成另种异常大多数情况下这是指把个低级异常转换=GramE>成应用异常(其含义更容易被用户了解异常)
1Z6ot/Q+T6{$Km
4N&]\ v2]+Xsc.C0N3i
  4、不要捕获异常
$D%E"uvF8Y
niv2vO4ue
  结论=GramE>:既然捕获了异常就要对它进行适当处理不要捕获异常的后又把它丢弃不予理睬JAVA中文站社区门户#A,b6UX5I3e,?

反例的 2:不指定具体异常 JAVA中文站社区门户%c8n$?o;^~i1@

g7\exnJ/g
  代码:15
,?$q8R^l.D-f
-D8s_cFz\V`PS
  许多时候人们会被这样美妙想法吸引:用catch语句捕获所有异常最常见情形就是使用catch(Exception ex)语句但实际上在绝大多数情况下这种做法不值得提倡为什么呢?
7^:APPe;wJAVA中文站社区门户y2cUc0y(VfhCXE]
  要理解其原因我们必须回顾catch语句用途catch语句表示我们预期会出现某种异常而且希望能够处理该异常异常类作用就是告诉Java编译器我们想要处理是哪种异常由于绝大多数异常都直接或间接从=SpellE>java.lang.Exception派生catch(Exception ex)就相当于说我们想要处理几乎所有异常 JAVA中文站社区门户b3iV]5VZ'i

X&[O9@o'{sg
  再来看看前面代码例子我们真正想要捕获异常是什么呢?最明显个是=SpellE>SQLException这是JDBC操作中常见异常个可能异常是=SpellE>IOException它要操作=SpellE>OutputStreamWriter显然在同catch块中处理这两种截然区别异常是不合适如果用两个catch=GramE>块分别捕获=SpellE>SQLException=SpellE>IOException就要好多了这就是说catch语句应当尽量指定具体异常类型而不应该指定涵盖范围太广Exception JAVA中文站社区门户'~7e#B X'g9z m

a0NTvA5n Ry]Fqx V"A
  另方面除了这两个特定异常还有其他许多异常也可能出现例如如果由于某种原因=SpellE>executeQuery返回了null该如何办?答案是让它们继续抛出即不必捕获也不必处理实际上我们不能也不应该去捕获可能出现所有异常其他地方还有捕获异常机会??直至最后由JVM处理 JAVA中文站社区门户 L} xa}yn

JAVA中文站社区门户(_/\G%? q9G_)\

TAG: 陋习
="xspace-totlerecord">2="xspace-totlepages">1/2="xspace-current">12>

标签:

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: