作者adrianshum (Alien)
看板java
标题Re: [问题] 程式的例外
时间Wed Apr 17 10:52:09 2013
乱入一下。
看见很多讨论 (甚至 OP) 把
try {
doSomething();
doAnotherThing();
} catch (NoDataForSomethingException e) {
// do something
} catch (NoDataForAnotherThingException e) {
// do handlng
}
跟
if (hasDataForSomething()) {
if (hasDataForAnotherThing()) {
doSomething();
doAnotherThing();
}
}
作比较。
其实这样比较有点偏颇。Exception 的用意是回报给 caller 有问题
发生,所以应该比较的是回报问题的机制。是不是可以事前检查来回避
问题是另一范筹的事。
所以应该比较的是:
try {
doSomething();
doAnotherThing();
} catch (NoDataForSomethngException e) {
// handling
} catch (NoDataForAnotherThingException e) {
//handling
}
和
int result = doSomething();
if (result == NO_DATA_FOR_SOMETHING) {
// handling
}
if (result == OK) {
result = doAnotherThing();
}
if (result== NO_DATA_FOR_ANOTHER_THING) {
//handling
}
首先要明白的是:事前检查并不能取代问题回报。
常用的问题回报机制有上面提到的两种(应该还有其他):
Exception 跟 回传结果
孰优孰劣其实难以一概而论。
Exception 最大的优点是你能把 Normal flow 写好,别人
读起 code 来的时候,就能知道正常的运作该长怎样 (上面的
例子就是先 doSomething() 再 doAnotherThing()),然後把
问题的处理集中一处。
可是 Exception 最大的缺点也是上面提到的特点:因为把某 logic
(e.g. doSomething() ) 与 它的问题处理分开了,所以容易遗漏,
想对整个流程(包括问题处理)理解的话,阅读上就会困难。
有一篇文章写得不错,虽然我不完全认同。可是可以肯定的是,要写
好的 Exception code 比大家想像中困难。用回传值之类的方法虽然
看起来累赘,可是要写一些能容易理解的 code 比较容易
http://www.joelonsoftware.com/items/2003/10/13.html
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 223.19.42.175
※ 编辑: adrianshum 来自: 223.19.42.175 (04/17 10:55)
1F:→ adrianshum:至於 checked/unchecked 则又是另一话题了 04/17 10:56
※ 编辑: adrianshum 来自: 223.19.42.175 (04/17 10:58)