该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-09
但是一下子都把所有的东西写在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; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-12-09
两种写法在可维护性方面没区别,因为语法错了,无法编译,逻辑错了你是看着堆栈信息找错误。
|
|
返回顶楼 | |
发表时间:2009-12-09
最后修改:2009-12-09
感觉都是一样的吧,try catch主要还是为了事务回滚
|
|
返回顶楼 | |
发表时间:2009-12-10
你不会printstacktrace么?怎么会不能定位错误呢?
|
|
返回顶楼 | |
发表时间:2009-12-10
最后修改:2009-12-10
try/catch一定要少用!!!
因为这根本不是structural programming! 很容易写出来意大利面条式的代码。。。 |
|
返回顶楼 | |
发表时间:2009-12-10
能不放在try catch中 就不要放 我见到的很多代码也是try catch里一大堆 但很多都是没必要try起来的
|
|
返回顶楼 | |
发表时间:2009-12-10
mikeandmore 写道 try/catch一定要少用!!!
因为这根本不是structural programming! 很容易写出来意大利面条式的代码。。。 符合中国国情的说法是炸酱面代码 |
|
返回顶楼 | |
发表时间:2009-12-10
Aguo 写道 感觉都是一样的吧,try catch主要还是为了事务回滚
是呀 除啦 回滚我也没看出还有什么 |
|
返回顶楼 | |
发表时间:2009-12-10
楼主只是举了个事物提交回滚的例子而已,属于举例不当。try catch包裹的语句多少对于性能来说应该没有影响,对错误定位也不存在(除非你把Exception信息覆盖掉或者catch处理不当)影响,只是过多的代码写入try catch中后会增加代码的递进层数,对于代码阅读和理解造成障碍。
|
|
返回顶楼 | |
发表时间:2009-12-10
没没想到这么多人对我写的这个问题这样的漠视,而且很是反对!
其实编程要是只会噼里啪啦的打键盘,什么都是一大堆的代码往上写。 什么都不清晰分出来,还做程序员干嘛。 其实很显然,如果我上面的代码一旦出现异常就会被catch住 然后 就让trans.rollback(); 然而不如trans.rollback(); 条件有没有达到 ,又会有异常,既然是为了catch数据库的异常就用单单对数据库try在里面。这样才容易分析。 logicgate 写道 你不会printstacktrace么?怎么会不能定位错误呢?
advantech 写道 两种写法在可维护性方面没区别,因为语法错了,无法编译,逻辑错了你是看着堆栈信息找错误。
如果是企业有自己的框架机制,很多事看不到错误信息的。 当然我的 catch (Exception ex) { trans.rollback(); throw ex; } 这段代码写的也不是很好应该用专门处理数据库的异常类,但是框架里好像没有,而且都是这么用的,所以是这样写的。 大家还可以积极讨论,看看我说的对不对 |
|
返回顶楼 | |