`
runfriends
  • 浏览: 226722 次
  • 性别: 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  
来踩的同学能不能给个回复说明下自己的想法?
来踩一下就走了,到底为什么啊?

相关推荐

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

    o接口的第一个方法hasError用于判断HttpResponse是否是异常响应(通过状态码) o接口的第二个方法handleError用于处理异常响应结果(非200状态码段) DefaultResponseErrorHandler是ResponseErrorHandler的默认...

    各类交换机的维护手册

    1.3.3 指示灯状态分析 8 1.3.4 电话拨测辅助分析 10 1.3.5 仪器、仪表辅助分析 10 1.3.6 话务统计辅助分析 11 1.3.7 接续、信令跟踪 11 1.3.8 测试 / 环回 13 1.3.9 对比 / 互换 14 1.3.10 倒换 / 复位 15 1.3.11 ...

    基于 Flask 框架开发的微信小程序后端项目

    亮点 基于原生的 Flask 构建 RESTful API 更灵活的 API文档生成方式(可带 Token) AOP(面向切面编程)设计,实现 参数校验层 & 异常...错误码:前后端开发的错误码的约定 文件管理和上传:文件夹和文件的管理 文章管理

    毕业设计-基于 Flask 框架开发的微信小程序后端项目,用于构建小程序商城后台

    毕业设计—基于 Flask 框架开发的微信小程序后端项目,用于构建小程序商城后台 亮点 基于原生的 Flask 构建 RESTful API ...错误码:前后端开发的错误码的约定 文件管理和上传:文件夹和文件的管理 文章管理

    WCDMA KPI监控和优化指导书

    4.11 MBMS业务接入问题分析 52 4.11.1 MBMS广播模式流程 52 4.11.2 UE无法收看节目原因分析 53 4.12 接入时延问题处理 54 4.12.1 非连续循环周期长度系数DRX的设置 54 4.12.2 是否关闭鉴权加密流程 54 4.12.3 执行早...

    基于Flask框架开发的微信小程序后端项目,用于构建小程序商城后台,电商相关;rbac权限管理;自动生成Swagger 风格文档

    基于 Flask 框架开发的微信小程序后端项目,用于构建小程序商城后台 (电商相关;rbac权限管理;附带自动生成Swagger 风格的API 文档...错误码:前后端开发的错误码的约定 文件管理和上传:文件夹和文件的管理 文章管理

    基于python Flask 框架开发的微信小程序后端项目,用于构建小程序商城后台

    错误码:前后端开发的错误码的约定 文件管理和上传:文件夹和文件的管理 文章管理 开发工具 Python 3.6(虚拟环境:pipenv) MySQL PyCharm(开发工具) Navicat(数据库可视化管理工具) 开发环境搭建 MySQL安装、...

    Visual C++ 数据库系统开发完全手册.part2

    20.9 异常处理 20.10 程序设计清单 20.11 技术、经验总结 20.11.1 技术总结 20.11.2 经验总结 20.12 系统的编译与发行 第21章 Visual C++ 6.0在学生管理系统中的应用 21.1 学生管理系统概述 21.1.1 开发背景及意义 ...

    Visual C++ 数据库系统开发完全手册.part1

    20.9 异常处理 20.10 程序设计清单 20.11 技术、经验总结 20.11.1 技术总结 20.11.2 经验总结 20.12 系统的编译与发行 第21章 Visual C++ 6.0在学生管理系统中的应用 21.1 学生管理系统概述 21.1.1 开发背景及意义 ...

    中国移动MMS规范.rar

    12.8.3.1 请求和错误状态码 65 12.9 将信息单元映射至SOAP单元 67 12.9.1 MM7_submit.REQ映射 67 12.9.2 MM7_submit.RES映射 69 12.9.3 MM7_deliver.REQ映射 72 12.9.4 MM7_deliver.RES 73 12.9.5 MM7_cancel.REQ...

    基于muduo开发的集群聊天服务器c++源码+数据库+使用说明.zip

    如果服务端异常退出,它会将所有在线的客户的状态都设置为 `offline`。即,让所有用户都下线。异常退出一般是 `CTRL + C` 时,我们需要捕捉信号。这里使用了 Linux 的信号处理函数,我们向信号注册回调函数,然后在...

    app服务器接口文档.docx

    状态码表示请求的处理结果,如 200 表示请求成功,404 表示请求未找到等。数据则是请求处理后返回的实际内容,包括用户信息、错误信息等。 使用指南 以下是使用该接口的一般步骤: 1. 准备工作:在开始使用接口...

    华为编程开发规范与案例

    而pDBFat是数据库的起始地址,如果pSysHead->dbf_count值异常过大,将导致pDBFat值超过最大内存地址值,随后进行的内存操作将导致内存操作越界错误,因而在测试过程中数据库破坏后就出现了主机死机的现象。...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    7.5 为错误通知使用图像和声音 218 7.6 使用验证组 219 7.7 小结 223 第8章 使用Master页面 225 8.1 需要Master页面的原因 225 8.2 Master页面基础 227 8.3 编写Master页面 228 8.4 编写内容页面 231 8.4.1 ...

    中国银行B2C商户支付网关接口规范Ver2.3.zip

    33 2.3.2 签名与验签 33 3 附件 36 3.1 批量文件接口示例文件 36 3.2 错误码说明 36 1 前言 1.1 文档说明 本文描述了中国银行网上支付相关服务通讯协议、报文格式、安全机制。作为商户端系统技术人员开发的参考文档...

    超级有影响力霸气的Java面试题大全文档

    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别?  Java Bean 是可...

    ASP.NET2.0高级编程(第4版)1/6

    21.4.3 HTTP状态码737 21.5 小结738 第22章 文件I/O和流739 22.1 使用驱动器、目录和文件739 22.1.1 DriveInfo类739 22.1.2 Directory和  DirectoryInfo类743 22.1.3 File和FileInfo类749 22.1.4 使用路径753 22.1....

    Java范例开发大全 (源程序)

     实例43 操作错误(UnsupportedOperationException) 60  4.2 运行时异常 61  实例44 找不到指定类时发生的异常(ClassNotFoundException) 62  实例45 请求的方法不存在(NoSuchMethodException) 63  4.3...

    java范例开发大全(pdf&源码)

    实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的方法不存在(NoSuchMethodException) 63 4.3 try…catch...

    java范例开发大全源代码

     实例43 操作错误(UnsupportedOperationException) 60  4.2 运行时异常 61  实例44 找不到指定类时发生的异常(ClassNotFoundException) 62  实例45 请求的方法不存在(NoSuchMethodException) 63 ...

Global site tag (gtag.js) - Google Analytics