`
runfriends
  • 浏览: 229721 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

异常、业务状态码、错误码的使用分析

阅读更多
http://www.iteye.com/topic/1112683
好吧,看了各位的发言,我突然觉的自己蛋疼了,我的公司也蛋疼了。
不过可别说我经历的项目初级。
从日pv超百万的论坛和价值几亿的银行项目我都经历过。现在我经历的最大项目,整个工程都将近2g了。
从几个人的小项目到几百人的项目我都有经历,不过都没有用异常控制业务子流程的,甚至我现在的公司在代码规范里面都严格禁止了使用异常做业务子流程控制。

之前我列出两种实现新增记录的方式,都是指分别在有惟一键和没有惟一键的情况下说的,我并没有说一定不要用哪种方式,一定要用哪种方式。只是要根据实际情况选择。如果数据表里面就是没有建惟一索引你怎么办呢?有时候你的选择余地很小,并不是自己想怎样就能怎样,也并不是自己认为哪种方式好就能用哪种方式,甚至也不是业内公认的哪种方式好就能用哪种方式。难道要求采用的那种方式你认为不好,你还不干了吗?当然只是举例代码,没有考虑更多可能。另一方面确实很多教材都不建议自己维护数据一致性,之所以这么要求是因为这么做对程序员水平要求很高;但是并不是完全禁止这么做。自己用程序实现维护数据一致性,极大程度降低了数据库压力,这是自实现维护数据一致性的优势。

曾看过有老外写的书,建议设计数据表的时候采用惟一键做主键;书里的意思就是像用户表这一类表就用不能重复的用户名做主键,但是数据量一旦超50000,字符串查询效率就会明显降低了,而使用主键查询是最频繁的。考虑到分表的情况,动辙十几万到上亿的记录,你要分多少表?更何况谁见过哪家博客的url里面出现过用户名。我想iteye博客的url那一串数字一定博主的用户名主键。

有同学说异常能包含更丰富的信息,这倒是不假,抛出异常能更有效更快速的定位问题和对非正常情况做出简单明了的说明。不过我始终认为异常就是用来指示程序运行的非正常情况的,而不是用来参与程序运行的正常流程的。
比如说登录用户不存在,密码错误,新注册用户名已被注册等是程序运行时的正常业务情况,不应该用异常处理。网络连接断开,数据库连接断了,违反数据约束了,本来应该存在的文件却没找到,本来应该存在的引用却是null,传递了错误的参数类型或错误的参数数量,这是非正常情况应该用异常。不知诸位注意过没有,在jdk里面状态码和异常是都有定义的,难道大家平时只注意到异常,没意识到jdk里面还定义了状态码和标识码?
至于究竟是用数据库自身的机制维护数据一致性还是自己实现,我明晚另开新帖再说吧,毕竟这个问题偏离了这个帖的主题。顺便在新帖介绍下我看过的一篇介绍ebay架构的文章。人家用不用数据库约束维护数据一致性,和dba有什么关系?人家的dba肯定很牛,只是架构设计是那样的。谷歌的搜索引擎还是自己实现的数据存储算法和文件系统,它内部的一些管理功能只用的mysql,难道你要说谷歌用不起商业数据库吗?我现在的一个同事,他以前的一家公司嫌数据库太慢,完全用c++实现的操作文件系统和磁盘阵列,用来存储和读取数据;用算法立即定位到要读写指定硬盘、指定磁道、指定扇区,连解析sql的时间都省了。难道你要说那家公司连数据库都不会用?当然这是针对特定领域的优化实现,我同事的上家公司不在意数据一致性和安全性,所以可以那么做。搜索引擎更多考虑搜索有效性,即使某些页面的数据没有了还可以重新用蜘蛛机器人爬到,还可以通过增加备份提高数据安全性。数据库更多考虑通用性和低成本可维护性。

至于究竟是采用业务码和异常来处理业务子流程。个人并不喜欢使用异常来处理子流程。以前我也用异常处理过子流程,后来觉的麻烦,每个子流程都要创建一个新的类,而业务一旦确定了,能发生的情况是极有限的,用业务编码或枚举能很容易的穷举出来。况且你难道连自己要用程序处理的业务有多少子流程都不清楚?即使抛开效率问题不谈,这难道不是最简单的方式?只是用于业务子流程之间的跳转,只是不同状态之间的转换,你还需要跳转的时候传递多少信息?
处理有多种状态的业务流程的时候,简单的情况可以使用业务状态码、枚举;复杂一点的可以使用状态模式,再复杂的可以使用工作流引擎,再复杂的可以使用有限状态机。不论是业务的可扩展性、可维护性和降低耦合、提高内聚,都比使用异常要好的多。

至于errorcode是用在出现了非正常情况的,这种时候用异常当然更方便些,也更容易标识出了哪类错误。这个时候使用错误码和枚举来标识非正常情况,自然有些捉襟见肘。我个人也喜欢使用异常处理非正常情况。但是在某些极端情况,比如系统资源极端紧张的环境下使用错误码显然是更好的选择。究竟使用什么,得视具体情况而定,并不能一概而论。不知回帖的各位有多少看过《代码大全》这本书。里面讲过业务状态码、错误码和异常究竟该在什么情况下使用。尽管书已经有些年头了,但是个人认为里面的观点并没有随着时间而老化。

最后再说一点,如果你实现的业务里面有众多业务子流程还有可能因为各种原因抛出不同的异常;如果要用异常处理业务子流程,那么就必然会把正常的业务子流程和各种非正常情况都用异常处理了。在这种时候你还能分的清哪些是为处理非正常情况自定义的异常,哪些是为处理业务子流程定义的异常?使用异常处理业务子流程就一定能保证稳定性和可维护性吗?一堆try catch你不觉的乱吗?从多个异常里面理清哪些是处理业务的异常,哪些是处理非正常情况的异常才会让人生不如死。使用业务状态码或枚举难道可维护性和稳定性就差吗?如果你对枚举很熟你会发现它是个很好用的东西,现在我就觉的它就是为处理各种不同状态而生的,你甚至可以借助枚举针对特定业务应用状态模式,而且我已经借助枚举实现了一个处理特定业务的流水线模式。如果你去阅读下状态机、工作流引擎的源码,想信你一定不会看到有用异常处理子流程和各种状态的情况。它们得为通用性考虑,即然通用情况下能不用异常处理,而且能工作的很好,很方便开发。相信在特定情况下也能一样工作的很好,很方便开发。也不会让人觉的不用异常会让人生不如死。

让各种技术和语法特性去处理它们该处理的,拿个扳手拧螺丝不觉的工具不合适吗?难道你没有更合适的工具?
4
13
分享到:
评论
5 楼 runfriends 2013-02-20  
lianglaiyang 写道
说了那么多,观点不鲜明,说服力不强,什么时候用状态码,什么时候用异常是合适?

我认为已经说清楚了自己的观点。
请看这篇文章的前一篇和后一篇
4 楼 lianglaiyang 2013-02-20  
说了那么多,观点不鲜明,说服力不强,什么时候用状态码,什么时候用异常是合适?
3 楼 runfriends 2011-07-31  
yaofeng928 写道
runfriends 写道
来踩的同学能不能给个回复说明下自己的想法?
来踩一下就走了,到底为什么啊?

我没有踩,但我希望这不要打击你的信心,把自己的想法写出来,分享给想看的人。
这里的环境就是这样,我看过很多很好的文章,也是被踩的一塌糊涂,有很多技术人员就是觉得别人不如自己,别人写的东西都是垃圾,贬低别人才能显示自己的优秀。
很多2、3年或3、4年工作经验的程序员都缺乏一个谦卑的态度,这是这个年龄段的通病。

谢谢,鼓励。我会再接再厉
2 楼 yaofeng928 2011-07-31  
runfriends 写道
来踩的同学能不能给个回复说明下自己的想法?
来踩一下就走了,到底为什么啊?

我没有踩,但我希望这不要打击你的信心,把自己的想法写出来,分享给想看的人。
这里的环境就是这样,我看过很多很好的文章,也是被踩的一塌糊涂,有很多技术人员就是觉得别人不如自己,别人写的东西都是垃圾,贬低别人才能显示自己的优秀。
很多2、3年或3、4年工作经验的程序员都缺乏一个谦卑的态度,这是这个年龄段的通病。
1 楼 runfriends 2011-07-31  
来踩的同学能不能给个回复说明下自己的想法?
来踩一下就走了,到底为什么啊?

相关推荐

    短信发送状态报告错误码(含移动、联通、电信及福建联通自定义错误码)

    本文将详细介绍短信发送状态报告中的错误码,包括中国移动、中国联通、中国电信以及福建联通自定义的一系列错误码,帮助IT专业人士和开发者更好地理解和处理短信服务中的常见问题。 ### 一、短信发送状态报告概述 ...

    CMPP HUAWEI错误码分析说明

    由于通信过程中可能会出现各种异常情况,因此对错误码的理解和处理变得尤为重要。本文将详细介绍华为CMPP协议中的常见错误码及其含义,旨在帮助开发者更好地理解错误码背后的逻辑,并提供相应的解决方案。 #### 二...

    移动返回错误状态码.doc

    在移动通信网络中,当发送短信时,系统会返回各种状态码来表示消息处理的结果。...通过分析状态码,可以及时发现问题并采取相应措施,提高服务质量。对于无法处理的错误,应及时联系技术部门或相关运营商寻求解决方案。

    db2错误码一览表

    ### DB2错误码一览表详解 #### 概述 在使用DB2数据库的过程中,难免会遇到各种错误。为了帮助用户快速定位并解决这些问题,本文档将详细介绍一系列常见的DB2错误码及其含义。这些错误码主要分为正数和负数两大类,...

    精讲RestTemplate自定义请求失败异常处理.docx

    2. `DefaultResponseErrorHandler`会进一步根据状态码段(如4xx表示客户端错误,5xx表示服务器错误)决定抛出何种异常。 二、自定义异常处理 为了自定义异常处理逻辑,我们可以创建一个实现`ResponseErrorHandler`...

    db2状态码

    这两种状态码共同作用,为DB2的错误诊断提供了强大的工具。 ### DB2状态码分类与解释 #### 成功状态码 - **00000**:表示SQL操作成功完成,没有异常。 #### 警告状态码 - **01xxx**:表示SQL操作虽然完成,但...

    联通SGIP网管错误码,2012年的资源

    根据错误来源的不同,SGIP错误码主要分为两大类:短信网关定义错误代码和SP业务管理系统定义错误代码。 ##### 一、短信网关定义错误代码 1. **0** - 无错误,命令正确。 - 表示操作成功,没有遇到任何问题。 2....

    POS机刷卡错误码汇总.doc

    16. **错误码39-41**:交易失败或卡片状态异常,如操作错误、不支持的交易类型或卡片挂失,需联系发卡行。 17. **错误码42**:发卡行找不到账户,可能存在黑卡风险。 18. **错误码43**:卡片被窃,应立即挂失并...

    asp.net 处理异常和错误

    可以使用`<error>`子元素过滤不同类型的异常,例如只对特定HTTP状态码或特定类型的异常显示特定的错误页面。 5. Elmah(Error Logging Modules and Handlers): Elmah是一个开源项目,用于记录ASP.NET应用程序的...

    MySQL存储过程的异常处理方法

    本实例展示了如何在MySQL存储过程中实现异常处理,以捕获并处理可能出现的错误。 首先,我们注意到在创建存储过程`myProc`时,使用了`delimiter $$`来改变MySQL客户端的语句分隔符,这是为了在存储过程中使用多个...

    实际项目中java自定义异常

    当发生特定的业务错误时,可以抛出自定义异常,并使用相应的错误码和错误消息: ```java throw new MyBusinessException(BusinessConstants.ERROR_CODE_INVALID_INPUT, BusinessConstants.ERROR_MSG_INVALID_INPUT)...

    联通SP业务用到的返回码汇总

    根据《中国联通增值业务鉴权中心接口规范-VAC与增值业务系统接口分册》及《SPMSV3业务错误码说明.20080527》,本文将详细介绍这些返回码的分类、代码以及对应的含义。 #### 协议错误 **1. PDU长度无效(大于30K...

    银行业务处理排号系统分析与设计

    5. 异常处理:考虑到网络问题、硬件故障等异常情况,设计相应的错误处理机制,保证系统的可用性。 四、未来扩展性 随着银行业务的多样化和客户需求的变化,系统应具备一定的扩展性,例如增加自助服务终端、支持在线...

    db2错误码 中文

    以下是对给定文件中提到的部分DB2错误码的详细解析: ### 1. SQL执行成功(00000) - **SQLCODE**: 0 - **SQLSTATE**: 00000 - **描述**: 此错误码表示SQL语句执行成功。 ### 2. SQL执行警告(01xxx) - **SQLCODE...

    retrofit+协程==网络请求框架封装完成,包括loading,刷新token,过滤返回的错误状态码

    其他非成功状态码,可以抛出异常或显示错误信息。 6. **使用协程**:在发起网络请求时,使用`CoroutineScope`和`launch`,将网络请求放入协程中执行,这样可以保证在网络请求过程中UI线程不会被阻塞。同时,可以在...

    在信网关错误码汇总

    在信网关作为一个重要的通信中间件,在实现消息传递的过程中,可能会遇到各种各样的异常情况,因此了解这些错误码对于维护系统的稳定运行至关重要。 #### 二、错误码详解 1. **[SGIPError] 错误码** - **0=RESP_...

    springboot全局异常处理

    例如,可以创建一个`BusinessException`,并包含错误码和错误消息字段,以便在抛出异常时携带业务相关的错误信息。 2. **使用@ControllerAdvice** `@ControllerAdvice`是Spring MVC提供的注解,用于标记一个类为...

    CMPP行业网关错误代码对照表

    **错误码:** 0001 **含义:** 发送的消息结构不符合CMPP协议的要求。 **处理建议:** - 仔细检查发送的消息格式,确保所有字段都符合CMPP协议标准。 - 如果使用的是第三方工具或软件,确认其支持最新的CMPP协议...

Global site tag (gtag.js) - Google Analytics