论坛首页 综合技术论坛

关于用异常控制程序流程的看法

浏览 22469 次
精华帖 (3) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-31  
居然没人回了。
为什么?
怎么回事?
0 请登录后投票
   发表时间:2011-08-01  
你为什么用oo?
因为我可以对目标域分类,让开发井井有条。

你为什么用异常控制业务流?
因为我可以让各种错误交织。
0 请登录后投票
   发表时间:2011-08-01  
仅仅基于主键的应用很少,即使k-v这样的nosql,多数也提供了index,省下来的是sql解析和执行计划评估开销
我是电信行业,没从事过互联网,但我相信这些企业的crm,工单、erp、供应链、cmdb都是直接或者间接来自企业解决方案,这些系统应该都是索引外键从生的系统
异常最优异的特性在于上溯和异常情况下的对象析构,这是errorcode绝对无法带来的优点
异常代替出错code是编程的一个巨大进步,实际上这是进化出来的体系,而且实现相当复杂
异常使得你可以很容易并且在编译期就能意识到应该处理那些问题,包装每一层的功能,并且使得每层的正常逻辑和异常逻辑分离,并且尤其在c++,它能让你不用管理异常导致的内存泄漏
多数公司都是因为自身使用不当和开发简便原因不使用索引或者外键
而那些互联网巨头业务上要用索引而采取自己实现,实际就是拿人力成本博取扩缩性能
0 请登录后投票
   发表时间:2011-08-02  
谢继雷 写道
> 不要说为了遵守第三范式什么的,数据量太大的时候,使用字符串做主键和增加太多约束,效率肯定降低。我参与过的所有项目,除了long型主键其它字段一律都不添加任何约束。

这只能说明你所参与的项目都不怎么样。SF上有很多企业应用的项目,就我看到的一些像 openerp, archiva, phpbb, oscommerce 等,他们不但充分使用了数据库约束,甚至有点滥用约束到变态的地步。我问过某开发者,他说,(大概意思)商业数据是非常宝贵的,程序只是为数据服务的代码,为了保护数据一致性,定义多少约束都不为过,不仅如此,只要有理由,你应该尽可能的定义更多的约束。至于效率问题,数据库系统是相当复杂的,一定有办法可以优化,如果数据库由于效率问题不能定义约束,这种数据库还有什么用?

Ebay 的数据库只用主键,这应该不可能,又不是中国铁道部,这样的大公司不可能连个专业的DBA都请不起。

这么说太片面。是否用约束取决于项目的类型。商业数据有多重要也取决于商业的类型。大型互联网项目大部分都是不一致满天飞的。数据的正确性取决于对“正确的定义”。试想一个植入心脏的数据库收集来自身体的反应信息,对于它来说,迟到的数据就是致命的。
0 请登录后投票
   发表时间:2011-08-02  
flounders 写道
sslaowan 写道
引用
定义了太多的业务异常,然后依不同的业务情况去抛出它们,然后在方法的调用处捕获它们。个人一直觉的这是一种蛋疼的做法


引用
至少直到目前为止我还没在开发过程中发现非用异常做流程控制不可的理由。




只能说lz很初级,做过的系统都太小太简单,抑或是不知道异常究竟应该怎么用




你把你的观点提出来,别总是说别人初级。。你这种回答有意思么。

是否捕获异常,robbin不建议拿异常来控制业务流程,我也曾经这么试过,就性能方面,已经有人钻研过并澄清了try catch性能损耗过高的问题(实际上,其消耗是可以忽略的),但我个人用着比较别扭,因为变成习惯上讲,总觉得其有点歪门邪道的感觉。针对lz的代码,枚举稍好,但有更好的选择,比如做一些重构甚至是模式来转移return语句。由于时间原因,逢合适的时候我会试验一下看看并发帖分享。


我的观点就是lz太初级啊后面那些话

你如果做一个超大型系统,好多模块,好多人开发,分好多层,如果用ErrorCode不得烦死。
0 请登录后投票
   发表时间:2011-08-02  
都说了不要用异常控制程序流程
0 请登录后投票
   发表时间:2011-08-02  
sslaowan 写道
flounders 写道
sslaowan 写道
引用
定义了太多的业务异常,然后依不同的业务情况去抛出它们,然后在方法的调用处捕获它们。个人一直觉的这是一种蛋疼的做法


引用
至少直到目前为止我还没在开发过程中发现非用异常做流程控制不可的理由。




只能说lz很初级,做过的系统都太小太简单,抑或是不知道异常究竟应该怎么用




你把你的观点提出来,别总是说别人初级。。你这种回答有意思么。

是否捕获异常,robbin不建议拿异常来控制业务流程,我也曾经这么试过,就性能方面,已经有人钻研过并澄清了try catch性能损耗过高的问题(实际上,其消耗是可以忽略的),但我个人用着比较别扭,因为变成习惯上讲,总觉得其有点歪门邪道的感觉。针对lz的代码,枚举稍好,但有更好的选择,比如做一些重构甚至是模式来转移return语句。由于时间原因,逢合适的时候我会试验一下看看并发帖分享。


我的观点就是lz太初级啊后面那些话

你如果做一个超大型系统,好多模块,好多人开发,分好多层,如果用ErrorCode不得烦死。



帅锅,你没仔细看我的主帖和我回的帖。
         定位错误,用errorcode确实不如异常方便。但我要讨论的主题是应不应该用异常控制正常的业务流程走向。
         你正常业务流程和运行期非正常状况都用异常处理,不觉的乱?
         另外项目达到一定规模,用异常控制业务流程走向你一样得定义很多很多的异常。
         最后,我再说一遍,我要讨论的主题是业务状态码和异常控制业务正常流程哪个方式更好。不是讨论程序的非正常状态发生时用错误码和异常哪个更好
0 请登录后投票
   发表时间:2011-08-02  
ppgunjack 写道
仅仅基于主键的应用很少,即使k-v这样的nosql,多数也提供了index,省下来的是sql解析和执行计划评估开销
我是电信行业,没从事过互联网,但我相信这些企业的crm,工单、erp、供应链、cmdb都是直接或者间接来自企业解决方案,这些系统应该都是索引外键从生的系统
异常最优异的特性在于上溯和异常情况下的对象析构,这是errorcode绝对无法带来的优点
异常代替出错code是编程的一个巨大进步,实际上这是进化出来的体系,而且实现相当复杂
异常使得你可以很容易并且在编译期就能意识到应该处理那些问题,包装每一层的功能,并且使得每层的正常逻辑和异常逻辑分离,并且尤其在c++,它能让你不用管理异常导致的内存泄漏
多数公司都是因为自身使用不当和开发简便原因不使用索引或者外键
而那些互联网巨头业务上要用索引而采取自己实现,实际就是拿人力成本博取扩缩性能


关于外键该不该用,也是一个争论很多的话题,很多情况下确实因为外键问题导致的导入数据出错等问题,也确实会因为创建了太多的数据库约束导致数据库效率降低。
我想再单开一帖讨论数据库约束、数据表设计方面的话题。发了帖欢迎您来拍。
对于异常与errorcode相比带来的优势,我非常赞同您的观点。
但是我开这个帖的本意是要讨论一下,对于正常业务流程,使用异常还是使用业务状态码更好;而不是要讨论错误码和异常哪种方式控制非正常程序状态更好。
0 请登录后投票
   发表时间:2011-08-03  
异常你应该理解为也是当前业务的一种状态
比如说文件不存在,表不存在,链接失败,这也是你面临业务中的一种可能
但这种状态实际是你调用那层无法控制的情况,而可能是你上级可以处理的
所以这是你应该向上级反映的,而且反应的东西如果有栈信息,异常对象附加内容,这些都会更好帮助定位问题,一个errorcode对于这种处理则太弱,而且不能做到跳转(长跳短跳都做不到)
0 请登录后投票
   发表时间:2011-08-03  
ppgunjack 写道
异常你应该理解为也是当前业务的一种状态
比如说文件不存在,表不存在,链接失败,这也是你面临业务中的一种可能
但这种状态实际是你调用那层无法控制的情况,而可能是你上级可以处理的
所以这是你应该向上级反映的,而且反应的东西如果有栈信息,异常对象附加内容,这些都会更好帮助定位问题,一个errorcode对于这种处理则太弱,而且不能做到跳转(长跳短跳都做不到)


这正是我前面说过的,这些属于程序运行时的非正常情况,理应使用异常处理。
而像登录用户名输入错误,密码错误,注册用户名已存在,用指定查询条件得到空结果集等应作为程序运行时的正常现象处理,这种时候不应用异常处理,而应该作为正常的业务逻辑出现在代码中。这种时候使用异常就不合适了。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics