作者swpoker (swpoker)
看板java
标题Re: [问题] 程式的例外
时间Wed Apr 17 11:43:37 2013
例外就是例外阿
如果要把例外当成是逻辑的一部份
那就不是例外了
如果是这样的话
我是采取以下的作法
interface Check{
boolean doCheck(State state);
}
check程式片段
void check(State state,Check [] checklist){
for(Check check:checklist){
if( check.doCheck(state) == false){
return ;
}
}
}
主程式应用:
Check[] checklist=new Check[]{
new Check(){
public boolean doCheck(State state){
if(state.money == 0){
state.doxxx();
state.error(xx);
return false;
}
return true;
}
}
, new Check(){
public boolean doCheck(State state){
if(state.money > 0 && state.money < state.price){
state.doxxx();
state.error(xx);
return false;
}
return true;
}
}
, new Check(){
public boolean doCheck(State state){
do_ok();
return true;
}
}
};
State state = new State();
docheck(state,checklist);
if(state.iserror()){
xxxx
}
我通常会比较栏惰
把检查跟处理放再同一个类别
只是遇到这种状况
我会把检查跟逻辑放再同一个介面
然後自主程式抽离出来
再利用DJ方式注入
实现了OCP原则
如此
我可以无限扩充检查与逻辑
而不用动到主程式
也可以针对单一检查与逻辑测试
或是整个测试
例如
可以测试众多检查是否有重复的状况->check101跟check303的条件是一样的
提供给大家参考
※ 引述《adrianshum (Alien)》之铭言:
: 乱入一下。
: 看见很多讨论 (甚至 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: 163.29.29.131
1F:→ adrianshum:要是你把例外当成逻辑以外的去想,那很大可能你是捉错 04/17 12:06
2F:→ adrianshum:用神了。比如 Checked Exception 就是需要 caller 明确 04/17 12:07
3F:→ adrianshum:去处理,这怎可能不当是逻辑一部份? 04/17 12:07
4F:→ adrianshum:当然你要是说逻辑只包括 normal flow 不包 failure 04/17 12:10
5F:→ adrianshum:handling logic 的话,你说的话就可以算对 04/17 12:10
6F:→ adrianshum:本来exception就只是把问题回报在语言层面上加的抽象化 04/17 12:13
7F:→ adrianshum:未有exception之前这些也是逻辑的一部份 04/17 12:13
8F:→ swpoker:我对於例外的定义就是-不在正常流程中所发生的 04/17 13:52
9F:→ swpoker:然後不要使用例外当作是逻辑~例 FileNotFoundException 04/17 13:58
10F:→ swpoker:好吧~其实我是想说不要滥用例外而已~例外就只是例外阿 04/17 14:00