首页 新闻 会员 周边

关于bll业务返回状态码还是要抛出一个异常

0
悬赏园豆:30 [已解决问题] 解决于 2016-05-25 13:59

最近非常困惑一个事情:

在bll中通常要进行数据验证,比如注册功能要验证 账号不能重复和手机号不能重复。如果这两个都没有重复才能将数据insert到db中。通常一个系统中还会有其他多处这样的业务需求。那么,遇到这种需求的时候是返回特定的编号来表示,还是通过抛出异常来表示。

比如:账号重复时候返回 -1 手机号重复返回 -2  ,正常通过,注册后返回 id值给消费者。

还是throw  CustomException("账号重复")  这样来告诉消费者呢。

我同时在晚上翻阅了资料和技术群进行询问:有些人推荐使用异常的方式来告诉消费者,但是,我有在微软的官方文档和其他文档中查阅到:正常的业务流程不应使用异常来处理 。

这时我就迷惑了,难道是我的理解有误。

欢迎拍砖,欢迎各抒己见

 

附两个相关文档链接:

http://www.cnblogs.com/aehyok/p/3750122.html

https://msdn.microsoft.com/zh-cn/library/ms173163.aspx

Myisqq的主页 Myisqq | 初学一级 | 园豆:95
提问于:2016-05-20 13:13
< >
分享
最佳答案
0

异常顾名思义就是错误的情况!

 

在c#中 用exception这个类来表示:

主要功能有2点

1.抛出信息

2.中断程序

 

换句话说 对于刚刚那句话的理解 正常的业务流程不应使用异常来处理 。

微软的意思应该是 异常应该适用于 非正常的业务逻辑中。至于这点 什么时候该使用异常就一目了然

当程序出错了 就应该用异常 而至于什么是程序错误 什么是错误信息 那么这个数据设计者的范畴 有设计者来界定那些是错误 那些是信息

 

使用异常 和错误信息区别及的优劣:

1.错误信息 不中断程序 异常 中断程序

2.错误信息不能跨层级传递 异常可以跨层级传递

 

根据以上2点我们就能区分出 异常和 错误信息的使用场景

 至于更细节一点 异常分为 内部异常 和系统异常 系统异常 例如 nullreference 这种级别的 微软抛出给你的 而你的内部异常应该是业务上的 例如:一个人没有登录 就不能获取用户名这一类的 需要区分 自己集成exception类 然后自己写自己的业务异常

 

上面是异常 的设计和触发 

 

之后当异常抛出以后

需要有位置捕获 可以是全局的 也可以是局部的

然后 有些异常可以忽略 有些异常 可以转换成信息 回发 有的 提示信息 记录日志 这些都属于异常处理 这部分需要自己写

 

收获园豆:30
小眼睛老鼠 | 老鸟四级 |园豆:2731 | 2016-05-23 13:17

请教

加入ui层请求bll层一个函数,执行删除操作。

场景:删除一个管理员。 要求:删除管理员之前确认至少有一个可以登录系统(被禁用的无法登陆)的管理员。

那么:在bll层我势必要判断可登陆系统的管理员数量,如果数量>1时候,删除该管理员。最终会产生三种状态:不允许删除/删除成功/删除失败(不考虑删除时候已经并发删除掉的情况)。

问题:我在检测到系统只有一个可以登录的管理员时候,是不是应该返回异常给ui层?在删除成功时候反给ui 层 ture?

Myisqq | 园豆:95 (初学一级) | 2016-05-23 14:12

@Myisqq: 用的着那么麻烦么 

我这里分享一下我的做法

1.全局捕获 bllexception异常

如果是 ajax异常 弹出对话框 对话框中显示错误信息

如果是 post提交异常 跳转到 错误页面弹出对话框 显示错误信息

以上为异常的处理方式

2.对于个别业务 

返回对象信息 全局捕获  apiexcepiton 

将apiexception 转换为 json 输出页面 格式为:

{status:"??",msg:"??"}

status 200 成功 300跳转 400 没找到 500 程序错误 

然后201为200的细化 以此类推 

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-05-23 14:29

@Myisqq: 对于你的需求 爱怎么做就怎么做吧 也没什么难的 怎么做都好

满足需求就是好的 

无论用什么做法 

至于 什么时候用excepton 什么时候用msg 

你现在还不具备分析的能力 先实现功能再说

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-05-23 14:29

@小眼睛老鼠: 谢谢你的指点,期望获取更为优质的答案

Myisqq | 园豆:95 (初学一级) | 2016-05-23 14:32

@Myisqq: 

再补充一下 所谓的好坏 都是相对而言的 例如你说的传msg

如果底层有一个位置需要传msg 上面调用的有n层 这个时候要传的话 

那不是需要逐层传递 哪有多麻烦

如果是exception 那么 可以在外层 try catch一下 不管嵌套多少层 最终都可以获取到

这相对于 msg的传值方式 不是舒服很多 

 

其他方面也一样 这也是所谓的好坏 (也就是所谓的设计)

但是如果就 仅仅解决问题来说 只要值传上来了 用exception传值和 用msg传值有什么区别呢?

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-05-23 15:04
其他回答(2)
0

返回一个固定的结果对象哇。ResultObj{Result= "", Msg= "xxxx"}

幻天芒 | 园豆:37175 (高人七级) | 2016-05-20 13:57

开始也是这样处理的,现在很是疑惑这一点,有些人推荐用 异常 处理,个人又觉得用异常也是不错的方法于是查阅资料,于是更加疑惑

支持(0) 反对(0) Myisqq | 园豆:95 (初学一级) | 2016-05-20 13:59

@Myisqq: 没有固定的方案。觉得那个用着爽就用吧。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2016-05-20 14:08
0

都是自定义一套自己公司标准的返回信息写法,不会用抛出异常将信息给用户,异常信息一般是记录到日志 

Artikel | 园豆:387 (菜鸟二级) | 2016-05-20 15:02

返回消息给消费者,不是用户(人类),至于返回什么样的类型信息,我继续搜集资料

支持(0) 反对(0) Myisqq | 园豆:95 (初学一级) | 2016-05-20 15:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册