最近非常困惑一个事情:
在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
异常顾名思义就是错误的情况!
在c#中 用exception这个类来表示:
主要功能有2点
1.抛出信息
2.中断程序
换句话说 对于刚刚那句话的理解 正常的业务流程不应使用异常来处理 。
微软的意思应该是 异常应该适用于 非正常的业务逻辑中。至于这点 什么时候该使用异常就一目了然
当程序出错了 就应该用异常 而至于什么是程序错误 什么是错误信息 那么这个数据设计者的范畴 有设计者来界定那些是错误 那些是信息
使用异常 和错误信息区别及的优劣:
1.错误信息 不中断程序 异常 中断程序
2.错误信息不能跨层级传递 异常可以跨层级传递
根据以上2点我们就能区分出 异常和 错误信息的使用场景
至于更细节一点 异常分为 内部异常 和系统异常 系统异常 例如 nullreference 这种级别的 微软抛出给你的 而你的内部异常应该是业务上的 例如:一个人没有登录 就不能获取用户名这一类的 需要区分 自己集成exception类 然后自己写自己的业务异常
上面是异常 的设计和触发
之后当异常抛出以后
需要有位置捕获 可以是全局的 也可以是局部的
然后 有些异常可以忽略 有些异常 可以转换成信息 回发 有的 提示信息 记录日志 这些都属于异常处理 这部分需要自己写
请教:
加入ui层请求bll层一个函数,执行删除操作。
场景:删除一个管理员。 要求:删除管理员之前确认至少有一个可以登录系统(被禁用的无法登陆)的管理员。
那么:在bll层我势必要判断可登陆系统的管理员数量,如果数量>1时候,删除该管理员。最终会产生三种状态:不允许删除/删除成功/删除失败(不考虑删除时候已经并发删除掉的情况)。
问题:我在检测到系统只有一个可以登录的管理员时候,是不是应该返回异常给ui层?在删除成功时候反给ui 层 ture?
@Myisqq: 用的着那么麻烦么
我这里分享一下我的做法
1.全局捕获 bllexception异常
如果是 ajax异常 弹出对话框 对话框中显示错误信息
如果是 post提交异常 跳转到 错误页面弹出对话框 显示错误信息
以上为异常的处理方式
2.对于个别业务
返回对象信息 全局捕获 apiexcepiton
将apiexception 转换为 json 输出页面 格式为:
{status:"??",msg:"??"}
status 200 成功 300跳转 400 没找到 500 程序错误
然后201为200的细化 以此类推
@Myisqq: 对于你的需求 爱怎么做就怎么做吧 也没什么难的 怎么做都好
满足需求就是好的
无论用什么做法
至于 什么时候用excepton 什么时候用msg
你现在还不具备分析的能力 先实现功能再说
@小眼睛老鼠: 谢谢你的指点,期望获取更为优质的答案
@Myisqq:
再补充一下 所谓的好坏 都是相对而言的 例如你说的传msg
如果底层有一个位置需要传msg 上面调用的有n层 这个时候要传的话
那不是需要逐层传递 哪有多麻烦
如果是exception 那么 可以在外层 try catch一下 不管嵌套多少层 最终都可以获取到
这相对于 msg的传值方式 不是舒服很多
其他方面也一样 这也是所谓的好坏 (也就是所谓的设计)
但是如果就 仅仅解决问题来说 只要值传上来了 用exception传值和 用msg传值有什么区别呢?
返回一个固定的结果对象哇。ResultObj{Result= "", Msg= "xxxx"}
开始也是这样处理的,现在很是疑惑这一点,有些人推荐用 异常 处理,个人又觉得用异常也是不错的方法于是查阅资料,于是更加疑惑
@Myisqq: 没有固定的方案。觉得那个用着爽就用吧。
都是自定义一套自己公司标准的返回信息写法,不会用抛出异常将信息给用户,异常信息一般是记录到日志
返回消息给消费者,不是用户(人类),至于返回什么样的类型信息,我继续搜集资料