`
xfei6868
  • 浏览: 68500 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

维护有感4 — try 里的代码不需要这么多

阅读更多
写数据库代码时候经常会用到try catch 。
但是一下子都把所有的东西写在try里,很显然在错误定位的时候,
很难发现真正错误的原因,而且性能上来说也不是个很好的表率。
看看下面这个:
Transaction trans = db.getTransaction();
try {
    trans.begin();
     String s_cgbh = Decoder.getParameter(request, "cgbh");
    String s_kwmc = Decoder.getParameter(request, "kwmc");
     long l_kw = AutoEmbody(request, s_cgbh, s_kwmc);
    if (l_kw == 0) { 
	db.executeUpdate("DELETE FROM SLXX WHERE CGBH='"				+ s_cgbh + "'");

	db.executeUpdate("INSERT INTO SLXX(CGBH,SLDM,SLMC,SLNF,ID) SELECT '" + s_cgbh + "',QKSYDM, QKSYMC,TO_CHAR(SYSDATE,'YYYY'),xmryxx_seq.nextval FROM LWQKXX,SLQK,QKSY WHERE LWQKXX.LSH=SLQK.LWQKLSH AND SLQK.QKSYDM=QKSY.QKSYDM AND LWQKXX.KWMC=' "+ s_kwmc + "'");
    }
     db.executeUpdate(SqlSciencepaperManager.getSciencepaperInsertSql(request));

	trans.commit();
    } catch (Exception ex) {
         trans.rollback();
         throw ex;
    }


可以看到这段代码里出现的不规范很多,而且这并不是维护的代码中最突出的。
但是这次特别说明的是代码过多的放到了try中,这样很容易让错误隐藏。
如果这样写就可以避免很多不必要的问题:
Transaction trans = db.getTransaction();

String s_cgbh = Decoder.getParameter(request, "cgbh");
String s_kwmc = Decoder.getParameter(request, "kwmc");
long l_kw = AutoEmbody(request, s_cgbh, s_kwmc);

StringBuffer delSqlBuf = new StringBuffer("DELETE FROM SLXX WHERE CGBH='").append(s_cgbh).append("'");
StringBuffer insertSqlBuf = new StringBuffer(128);
insertSqlBuf.append("INSERT INTO SLXX(CGBH,SLDM,SLMC,SLNF,ID) SELECT '")
               .append(s_cgbh).append("',QKSYDM, QKSYMC,TO_CHAR(SYSDATE,'YYYY'),xmryxx_seq.nextval FROM LWQKXX,SLQK,QKSY WHERE LWQKXX.LSH=SLQK.LWQKLSH AND SLQK.QKSYDM=QKSY.QKSYDM AND LWQKXX.KWMC=' ")
               .append(s_kwmc).append("'");

try {
    
    trans.begin();
    if (l_kw == 0) { 
	db.executeUpdate(delSqlBuf.toString());
	db.executeUpdate(insertSqlBuf.toString());
    }
     db.executeUpdate(SqlSciencepaperManager.getSciencepaperInsertSql(request));

	trans.commit();
    } catch (Exception ex) {
         trans.rollback();
         throw ex;
    }



分享到:
评论
11 楼 xfei6868 2009-12-10  
风花雪月饼 写道
如果楼主捕获的是SQLException估计没这么多人说你。
可惜,楼主偏偏要用Exception来讲解这个例子。


我会认为:long l_kw = AutoEmbody(request, s_cgbh, s_kwmc);
可能抛异常,比如格式化错误啦,NullPoint之类。所以我认为你第一种处理方式是对的。


你的观察的很仔细,但是我觉得这样还是应该分开的好,什么异常用什么捕获。
10 楼 风花雪月饼 2009-12-10  
如果楼主捕获的是SQLException估计没这么多人说你。
可惜,楼主偏偏要用Exception来讲解这个例子。


我会认为:long l_kw = AutoEmbody(request, s_cgbh, s_kwmc);
可能抛异常,比如格式化错误啦,NullPoint之类。所以我认为你第一种处理方式是对的。
9 楼 xfei6868 2009-12-10  
没没想到这么多人对我写的这个问题这样的漠视,而且很是反对!
其实编程要是只会噼里啪啦的打键盘,什么都是一大堆的代码往上写。
什么都不清晰分出来,还做程序员干嘛。
其实很显然,如果我上面的代码一旦出现异常就会被catch住
然后 就让trans.rollback();  
然而不如trans.rollback();   条件有没有达到 ,又会有异常,既然是为了catch数据库的异常就用单单对数据库try在里面。这样才容易分析。
logicgate 写道
你不会printstacktrace么?怎么会不能定位错误呢?

advantech 写道
两种写法在可维护性方面没区别,因为语法错了,无法编译,逻辑错了你是看着堆栈信息找错误。

如果是企业有自己的框架机制,很多事看不到错误信息的。
当然我的
catch (Exception ex) {   
         trans.rollback();   
         throw ex;   
    }  

这段代码写的也不是很好应该用专门处理数据库的异常类,但是框架里好像没有,而且都是这么用的,所以是这样写的。
大家还可以积极讨论,看看我说的对不对
8 楼 topcloud 2009-12-10  
楼主只是举了个事物提交回滚的例子而已,属于举例不当。try catch包裹的语句多少对于性能来说应该没有影响,对错误定位也不存在(除非你把Exception信息覆盖掉或者catch处理不当)影响,只是过多的代码写入try catch中后会增加代码的递进层数,对于代码阅读和理解造成障碍。
7 楼 whaosoft 2009-12-10  
Aguo 写道
感觉都是一样的吧,try catch主要还是为了事务回滚

是呀 除啦 回滚我也没看出还有什么
6 楼 黑暗浪子 2009-12-10  
mikeandmore 写道
try/catch一定要少用!!!
因为这根本不是structural programming!
很容易写出来意大利面条式的代码。。。

符合中国国情的说法是炸酱面代码
5 楼 illu 2009-12-10  
能不放在try catch中 就不要放 我见到的很多代码也是try catch里一大堆 但很多都是没必要try起来的
4 楼 mikeandmore 2009-12-10  
try/catch一定要少用!!!
因为这根本不是structural programming!
很容易写出来意大利面条式的代码。。。
3 楼 logicgate 2009-12-10  
你不会printstacktrace么?怎么会不能定位错误呢?
2 楼 Aguo 2009-12-09  
感觉都是一样的吧,try catch主要还是为了事务回滚
1 楼 advantech 2009-12-09  
两种写法在可维护性方面没区别,因为语法错了,无法编译,逻辑错了你是看着堆栈信息找错误。

相关推荐

Global site tag (gtag.js) - Google Analytics