`

维护有感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  
两种写法在可维护性方面没区别,因为语法错了,无法编译,逻辑错了你是看着堆栈信息找错误。

相关推荐

    UiPath实践经验总结.docx

    3. 读取 Configuration 也有可能出错,需要包一层 Try…Catch…。这意味着在读取 Configuration 时,需要捕捉可能出现的错误,以免影响 robot 的稳定性。 4. 重复出现的逻辑应该提取出来作为单独的模块。这点可以...

    Java编码规范-细则.pdf

    编码规范对于开发团队来说至关重要,它有助于保持代码的整洁、一致性和可维护性。尽管给出的【部分内容】在内容上显得零散且有些混乱,但我们可以从中提取和推断出一些可能的编码规范细则。 1. 文件结构和包导入 从...

    VB资产管理系统完全工程和代码

    在系统中,可能有Student类、Teacher类、Course类等,它们封装了各自属性和方法,增强了代码的复用性和可维护性。 8. **异常处理** 为了保证程序的健壮性,VB提供了Try-Catch结构来捕获和处理运行时可能出现的错误...

    c#博饼小程序

    10. **代码优化**:为了提高程序性能,开发者需要关注代码的效率,避免不必要的计算和内存消耗,同时保持代码的可读性和可维护性。 综上所述,开发C#博饼小程序涵盖了从基础的编程概念到高级的用户界面设计和数据...

    C++毕业设计:基于Qt的多线程局域网聊天系统(含客户端+服务端).zip

    在这个项目中,C++用于编写核心逻辑和数据处理部分,确保代码的效率和可维护性。 2. **Qt框架**:Qt是一个跨平台的开发框架,主要用于创建图形用户界面(GUI),同时也支持非GUI应用程序。它提供了丰富的API,方便...

    C#控制台小游戏

    这些状态需要在游戏的不同阶段得到适当的更新和维护。 6. **用户界面**:虽然控制台游戏没有图形化界面,但可以通过巧妙地使用颜色和格式化来提高用户体验。`Console.ForegroundColor`和`Console.BackgroundColor`...

    爪哇夜未眠(蔡學鏞java)

    这些基础知识对于任何Java程序员来说都是至关重要的,因为它们构成了编写高效、可维护代码的基础。 首先,我们来谈谈Java的语法。Java是一种静态类型的面向对象编程语言,它引入了类、对象和接口的概念。理解类的...

    ch3_java_

    理解封装、继承和多态这三大面向对象特性对于提升代码的可读性、可维护性和复用性有着重要意义。 封装是隐藏类内部细节,只对外提供公共接口的一种机制。这可以防止代码被错误地修改,同时提高安全性。继承允许一个...

    期末python项目,学生管理系统

    7. **模块化编程**:将功能划分为不同的模块,提高代码复用性和可维护性。 8. **测试和调试**:编写测试用例,使用assert语句检查程序的正确性,学会使用debug工具。 9. **版本控制**:学习使用Git进行版本控制,...

    Java夜未眠.程序员的心声

    Java,作为一种广泛应用于全球的高级编程语言,深受程序员的喜爱,尤其在企业级应用开发领域有着不可替代的地位。"Java夜未眠.程序员的心声"这个标题不仅揭示了它是一部关于Java编程的学习资料,还寓含了程序员们为...

    小敏公共日记本

    5. **模板引擎**:为了分离业务逻辑和视图,可能会使用模板引擎(如Smarty)来构建前端界面,使得代码更易维护。 6. **错误处理与日志**:良好的错误处理机制能帮助开发者追踪和修复问题,PHP的`error_reporting()`...

    C++软件编程规范和范例

    总的来说,《C++软件编程规范和范例》这本书不仅教授编程技巧,还强调了良好的编程习惯和规范,这对于写出可读性高、易于维护的代码至关重要。遵循这些规范,可以提高团队合作效率,减少错误,并为将来更深入的C++...

    thinking in java 中英文两本

    4. **异常处理**:介绍如何正确使用try-catch-finally语句,以及自定义异常的创建和使用。 5. **输入/输出(I/O)**:涵盖了文件操作、流的概念,以及网络I/O,为处理大量数据和实现通信提供了基础。 6. **多线程**...

    C#开发实例大全(基础卷)源码

    4. **异常处理**:C#使用try-catch-finally语句进行错误处理。源码中可能会有各种示例,展示如何捕获和处理运行时可能出现的异常,以提高程序的健壮性。 5. **文件操作**:在C#中,可以使用System.IO命名空间进行...

    c++大纲资料.txt

    掌握类的定义、构造函数与析构函数、成员变量与成员函数以及访问修饰符,可以帮助程序员编写模块化、易于维护的代码。 7. 继承与多态 继承是面向对象编程的核心特性之一,它允许程序员根据已有类创建新类,实现代码...

    用java写的银行取款系统 界面很特别啊

    在这个银行取款系统中,Java的强类型、面向对象特性使得代码结构清晰,易于维护。 2. **Swing或JavaFX GUI库**:由于描述提到“界面很好”,我们可以推测开发者可能使用了Swing或JavaFX来构建用户界面。Swing是Java...

    Java范例开发大全源程序

    这本书的每个章节都对应着一个特定的Java技术或概念,通过实际的代码示例来阐述理论知识,使学习者能够更直观地感受到Java的魅力。 首先,我们来看Java的基础部分,这部分通常包括变量、数据类型、运算符、流程控制...

    learnPythonTheHardWay:两个杜比太简单了

    "两个杜比太简单了"这句话可能是在暗示,仅仅依赖基础的示例是不足以深入理解Python的,我们需要通过解决更复杂的问题来提升技能。 Python的基础知识包括但不限于变量、数据类型(如整型、浮点型、字符串、布尔型)...

    Java夜未眠程序员的心声

    这些模式有助于提高代码的可读性和可维护性,也是面试中常被问到的话题。 数据库交互是许多Java应用的核心部分,因此JDBC(Java Database Connectivity)的使用技巧和最佳实践可能也在讨论范围内。此外,随着NoSQL...

    VBA初学者教程.zip

    4. **宏的创建与录制**:学习如何录制和编辑宏,通过实际操作感受VBA的强大功能,同时掌握宏的安全性和管理。 5. **函数与过程**:掌握Sub过程和Function函数的用法,了解参数传递,以及如何使用内置和自定义函数来...

Global site tag (gtag.js) - Google Analytics