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

2023-11-02

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

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

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

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

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

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

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

让各种技术和语法特性去处理它们该处理的,拿个扳手拧螺丝不觉的工具不合适吗?难道你没有更合适的工具?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异常、业务状态码、错误码的使用分析 的相关文章

随机推荐

  • 链接分析算法之:HITS算法

    HITS HITS Hyperlink Induced Topic Search 算法是由康奈尔大学 Cornell University 的Jon Kleinberg 博士于1997 年首先提出的 为IBM 公司阿尔马登研究中心 IBM
  • RPC实践(二)JsonRPC实践

    一 JsonRPC介绍 json rpc是基于json的跨语言远程调用协议 比xml rpc webservice等基于文本的协议传输数据格小 相对hessian Java rpc等二进制协议便于调试 实现 扩展 是非常优秀的一种远程调用协
  • SQL中的相关了解

    参考博客 https blog csdn net qq 41582642 article details 82625104
  • Vue后台管理系统模板推荐

    原文链接 Vue后台管理系统模板推荐 更新记录 2022 08 31 更新 stars 数量 按照 stars 排序 2021 06 18 新增几款后台管理系统模板 注意一点的是 在原基础上直接加在后面 未按starts数排序 2021 0
  • Acwing 148.合并果子

    include
  • 有八层灯塔,每层的灯数都是上一层的一倍,共有765 盏灯,编程求最上层与最下层的灯数。

    include
  • 前端三件套搭建登录页面(HTML+CSS+JS)

    目录 HTML JS代码 登录页面 代码解析 CSS代码 注册页面HTML代码 素材图片 小结 HTML JS代码 登录页面 div h3 欢迎登录 h3 div div div
  • 安信可VC系列语音识别的使用教程

    安信可VC 02语音识别的应用 本篇只讲述在Windows系统下的应用 Linux下的请参考官方文档介绍和说明 1 安信可VC 02离线语音识别简介 VC系列模组是我司开发的一款AI离线语音识别的产品 主芯片是云知声推出的离线语音识别芯片锋
  • Rustful接口开发

    Rustful接口开发 什么是api api简称接口 就是一些预先定义的函数 目的是能够让应用程序或者开发人员具有能够访问指定网络资源的能力 而又无需关心访问的源码 或理解内部工作机制的细节 api的产生 web Android iOS 由
  • matlab实现各向异性扩散

    看书一直不理解各向异性扩散究竟是什么 直到看了某大佬的解释 主要是用来平滑图像的 克服了高斯模糊的缺陷 各向异性扩散在平滑图像时是保留图像边缘的 和双边滤波很像 通常我们有将图像看作矩阵的 看作图的 看作随机过程的 记得过去还有看作力场的
  • flutter 状态栏文字颜色

    SystemChrome setSystemUIOverlayStyle SystemUiOverlayStyle dark 还有一种方法是在appbar里面的一个参数 brightness 但是 两者都会对当前的widget重构 比如页面
  • 毕业1年从事软件测试拿下11.5k,没有给98后丢脸吧...

    自我介绍一下 本人是20年毕业的专科生 专业软件技术 21年8月拿到月薪11 5k的offer 开启我的软件测试之路 现在把本人的经历写出来 希望能给像我一样想要从事软件测试的朋友们一些建议 学还是不学 这是个问题 19年底我找到软件开发的
  • 大语言模型之九- BERT

    Natural Language Processing NLP 包括自然语言理解和自然语言生成 自然语言理解的应用包括语义分析 机器客服 语音识别 机器翻译等 transformer这一深度网络架构在NLP领域占有举足轻重的地位 BERT是
  • linux7重置密码操作,linux重置管理员密码的操作方法

    linux重置管理员密码的操作方法 发布时间 2020 04 02 11 08 01 来源 亿速云 阅读 34 作者 小新 今天小编给大家分享的是linux重置管理员密码的操作方法 很多人都不太了解 今天小编为了让大家更加了解linux重置
  • mysql myisam 数据丢失_用Myisamchk进行崩溃恢复MySQL

    由MySQL用来存储数据的文件格式以已经被广泛地测试过 但是总是有外部情况可以导致数据库表被破坏 mysqld进程在一个写入当中被杀死 计算机的意外关闭 例如 如果计算机掉电 一个硬件错误 这章描述如何检查和处理在MySQL数据库中的数据损
  • 这 7个 AI 写作助手,太实用了

    想象一下 你正在办公桌前为你的广告输入标题 但你突然思维阻塞并卡住了 可惜这时还没有神奇的软件可以帮助你想出点子 或许是有的 2023 年 AI 写作工具似乎不可避免地会很快融入我们的工作流程中 现代知识工作者已经看到了 ChatGPT 的
  • 流形学习(Manifold Learning)以及推导

    流形学习 Manifold Learning 前言 流行学习简介 主要的代表方法 1 Isomap 等距映射 Isomap算法步骤 2 LLE Locally Linear Embedding 局部线性嵌入 LLE基本思想 LLE算法步骤
  • ggplot2读书笔记5:工具箱——误差线、加权数、展示数据分布

    今天我们学习第三章的最后几节 其中的 绘制地图 部分 因为我木有顺利安装maps package 而且在我们的工作中也不常用 暂时跳过 下面继续 6 添加误差线和误差范围 数据中的不确定信息的展示也很重要 ggplot2中 四类几何对象可以
  • 【嵌入式百科】001——字长、比特、字节、字、双字

    一 字长 计算机的每个字所包含的位数称为字长 计算的字长是指它一次可处理的二进制数字的数目 一般地 大型计算机的字长为32 64位 小型计算机为12 32位 而微型计算机为4 16位 二 比特 bit 数据传输大多是以 位 bit 又名 比
  • 异常、业务状态码、错误码的使用分析

    url http www iteye com topic 1112683 url 好吧 看了各位的发言 我突然觉的自己蛋疼了 我的公司也蛋疼了 不过可别说我经历的项目初级 从日pv超百万的论坛和价值几亿的银行项目我都经历过 现在我经历的最大