论坛首页 入门技术论坛

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

浏览 4425 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-12-09  
写数据库代码时候经常会用到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;
    }



   发表时间:2009-12-09  
两种写法在可维护性方面没区别,因为语法错了,无法编译,逻辑错了你是看着堆栈信息找错误。
0 请登录后投票
   发表时间:2009-12-09   最后修改:2009-12-09
感觉都是一样的吧,try catch主要还是为了事务回滚
0 请登录后投票
   发表时间:2009-12-10  
你不会printstacktrace么?怎么会不能定位错误呢?
0 请登录后投票
   发表时间:2009-12-10   最后修改:2009-12-10
try/catch一定要少用!!!
因为这根本不是structural programming!
很容易写出来意大利面条式的代码。。。
0 请登录后投票
   发表时间:2009-12-10  
能不放在try catch中 就不要放 我见到的很多代码也是try catch里一大堆 但很多都是没必要try起来的
0 请登录后投票
   发表时间:2009-12-10  
mikeandmore 写道
try/catch一定要少用!!!
因为这根本不是structural programming!
很容易写出来意大利面条式的代码。。。

符合中国国情的说法是炸酱面代码
0 请登录后投票
   发表时间:2009-12-10  
Aguo 写道
感觉都是一样的吧,try catch主要还是为了事务回滚

是呀 除啦 回滚我也没看出还有什么
0 请登录后投票
   发表时间:2009-12-10  
楼主只是举了个事物提交回滚的例子而已,属于举例不当。try catch包裹的语句多少对于性能来说应该没有影响,对错误定位也不存在(除非你把Exception信息覆盖掉或者catch处理不当)影响,只是过多的代码写入try catch中后会增加代码的递进层数,对于代码阅读和理解造成障碍。
0 请登录后投票
   发表时间:2009-12-10  
没没想到这么多人对我写的这个问题这样的漠视,而且很是反对!
其实编程要是只会噼里啪啦的打键盘,什么都是一大堆的代码往上写。
什么都不清晰分出来,还做程序员干嘛。
其实很显然,如果我上面的代码一旦出现异常就会被catch住
然后 就让trans.rollback();  
然而不如trans.rollback();   条件有没有达到 ,又会有异常,既然是为了catch数据库的异常就用单单对数据库try在里面。这样才容易分析。
logicgate 写道
你不会printstacktrace么?怎么会不能定位错误呢?

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

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

这段代码写的也不是很好应该用专门处理数据库的异常类,但是框架里好像没有,而且都是这么用的,所以是这样写的。
大家还可以积极讨论,看看我说的对不对
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics