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

问题描述

最近非常困惑一个事情:在bll中通常要进行数据验证,比如注册功能要验证账号不能重复和手机号不能重复。如果这两个都没有重复才能将数据insert到db中。通常一个系统中还会有其他多处这样的业务需求。那么,遇到这种需求的时候是返回特定的编号来表示,还是通过抛出异常来表示。比如:账号重复时候返回-1手机号重复返回-2,正常通过,注册后返回id值给消费者。还是throwCustomException("账号重复")这样来告诉消费者呢。我同时在晚上翻阅了资料和技术群进行询问:有些人推荐使用异常的方式来告诉消费者,但是,我有在微软的官方文档和其他文档中查阅到:正常的业务流程不应使用异常来处理。这时我就迷惑了,难道是我的理解有误。欢迎拍砖,欢迎各抒己见附两个相关文档链接:http://www.cnblogs.com/aehyok/p/3750122.htmlhttps://msdn.microsoft.com/zh-cn/library/ms173163.aspx

解决方案

解决方案二:
我的处理方式类似于返回特定编号
解决方案三:
引用1楼u010052814的回复:

我的处理方式类似于返回特定编号

目前也是采用这中方式,不过这几天感觉这种方式很粗陋
解决方案四:
你参考微软的错误机制,一般是一个错误编号微信也有错误码列表,errCode和errMsg相结合
解决方案五:
{"code":1001,"msg":"数据库操作异常"}
解决方案六:
这些返回的编号其实是你的业务逻辑部分,这根本不是异常,那为什么要返回异常呢?
解决方案七:
引用楼主niuqian___123456的回复:

但是,我有在微软的官方文档和其他文档中查阅到:正常的业务流程不应使用异常来处理。这时我就迷惑了,难道是我的理解有误。

如果你只知道抠字眼、走极端,那么就有了理解有误。正常的流程就是指“在讲的、有逻辑设计文档的”,而没有逻辑设计文档的东西就应该走抛出异常流程,让用户回退。假设一个程序员不按照逻辑设计文档的流程去做if判断,而是等着系统抛出异常之后再来“隐藏异常”、让用户感觉好像是继续操作下去了,那么这就是滥用异常。例如,如果业务流程写的是“if用户名有重复then显示1elseif用户名含有非法字符then显示2else注册”,这就叫做“正常的业务流程”。这时候你写bll时,你要实现3个服务,其中前两个服务都给前端返回true/false,第三个服务没有返回(或者说只有一个默认的返回)。这就叫做“正常的业务流程”,因为人家设计文档要求你实现3个服务了,你若硬要偷懒给省为1个服务就不正常了。再举一个例子。假设用户要从页面上将自己的收入分摊到n个账户中,如果逻辑设计文档中告诉你说“先判断如果n==0提示用户必须选择至少一个目标账户”,这个时候如果你忽略了这个逻辑设计,那么就是“用异常来取代正常的业务流程”。但是抠字眼、走极端会产生想反的结果。例如业务逻辑设计文档上本来就没有“if账户数==0"的判断,或者本来就没有“如果目标文件不存在怎么办”的描述,你非要说“我就是不抛出异常,我就是耗时间等着公司重新设计业务逻辑”,这就走了相反的极端。你这个时候就应该抛出异常,而不是用什么“正常的业务逻辑不应该用异常来处理”的借口。可见“是非”都是人定的,不是天定的。比如说,当你的bll抛出异常之后,前端隐藏了这个异常,而继续走其它业务逻辑,那么这就是“用异常来取代正常的业务流程”了。而不是你的bll来纠结什么是非问题。你的bll根本不知道什么叫做“正常的业务流程”,只有你站在前端的角度才能看明白。有些初学者满脑子都是底层、后端那点代码,硬要辨别是非。实际上这个是非是要从前端应用需求来看待的,不是从底层来决定的。
解决方案八:
这里边体现的是业务处理逻辑设计问题,而你的bll纠结于“是不是要抛出异常”的问题,其实这就是偷换概念了。假设业务逻辑文档上规定了“在提交申请时,如果用户还没有上传资格证书图片,则应该引导用户去上传图片”。1.正常的程序是,先调用BLL的一个服务来判断用户是否已经提交了资格证书,然后再调用BLL的另一个服务2.用异常来取代正常处理流程的程序是,先调用BLL层对“认证申请”操作,抛出异常之后,根据异常信息string来隐藏这个异常,去引导用户去上传图片。正常的业务流程设计是说“根本走不到BLL层的最后一步”,先进行证书判断。而错误的流程是先去挑战BLL的“提交申请”最终功能,然后当BLL给出一个返回值之后再来重走前一步正常的上传证书流程。这跟你的“是返回特定的编号来表示,还是通过抛出异常来表示”疑问有什么关系呢?根本不纠结于这里返回什么值。实际上你返回一个值、还是使用系统更规范的异常机制,都是异常。你说来说去都是在说BLL对于异常的反馈形式,你把系统规范的异常,你吧你自己定义的不规范地“返回一个错误码”不叫做异常,这其实根本解决不了什么问题。
解决方案九:
你把系统规范的异常叫做“异常”,你吧你自己定义的不规范地返回一个错误码不叫做“异常”,这其实根本解决不了什么问题。而人家微软文档上说的“不要用异常来处理正常的业务流程”不是站在你的层面上的。人家是从前端业务流程上来说的。也就是我上面举的两种实现的例子:1.先调用BLL的一个服务判断是否提交了资格证书,然后再调用系统另一个BLL来处理注册认证,这就是正常的流程。2.先调用BLL的注册认证服务,然后当BLL(不管是返回一个string、number,还是规范的异常信息)给出错误码之后,又来返回头来进入提交资料图片流程,这就是用异常来取代正常流程了!

时间: 2024-09-17 04:11:35

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

HTTP协议返回状态码大全

2014年腾讯招聘题中有这样一道题  浏览器访问某页面,HTTP协议返回状态码为403时表示:(B) A 找不到该页面 B 禁止访问 C 内部服务器访问 D 服务器繁忙 处于兴趣,网络搜集了状态返回码大全,属于计算机网络的知识[都说了是搜集的,非原创] HTTP返回状态代码 当用户试图通过HTTP或FTP协议访问一台运行主机上的内容时,Web服务器返回一个表示该请求的状态的数字代码.该状态代码记录在服务器日志中,同时也可能在 Web 浏览器或 FTP客户端显示.也就是我们打开页面发生错误时浏览器

js技术-百度云Table请求失败,返回状态码是240

问题描述 百度云Table请求失败,返回状态码是240 {"status":240,"message":"APP 服务被禁用}http://api.map.baidu.com/geodata/v3/poi/list?geotable_id=114366&ak=g14pLbVLOKULkhjf29VTuEq2 解决方案 APP 服务被禁用 你的使用超出了配额或者你的账户被封禁,具体你可以打电话问问.

用httpclient调用google elevation api时返回状态码为405

问题描述 用httpclient调用google elevation api时返回状态码为405 如题:代码如下,为神马返回状态码为405呢?有哪位大神用过google elevation api,通过浏览器直接访问接口正常,用httpclient访问在不设置代理前直接连接超时,设置代理后后返回405的状态码. public static void test2(){ try { SSLContext sslcontext = SSLContexts.custom() .loadTrustMate

子类方法返回类型必须和父类相同,抛出的异常声明可以小于或等于父类

Overload译为重载:Override译为重写或者覆盖:  Overload讨论: Java中同一个类不可以有两个相同的方法(方法名.参数类型.参数个数和参数位置都  相同).但可以有方法名相同,参数不同(参数类型.参数个数和参数位置不相同)的方法.这  种相同的方法名,参数不同的方法称为重载. public class Test { public void fn(String name) {} public void fn(int age) {} public void fn(String

404页测试返回状态码是200解决方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 404页面就是当用户输入了错误的链接时,返回的页面.目的是告诉浏览者其所请求的页面不存在或链接错误,同时引导用户使用网站其他页面而不是关闭窗口离开. 这几天网站的内容大改变由原先的博客变成了"友情链接站",为了弥补些损失,就想起了做一个404页,引导浏览者,结果404页做好了也上传到了空间中,输入http://51link

【spring源码学习】spring配置的事务方式是REQUIRED,但业务层抛出TransactionRequiredException异常问题

(1)spring抛出异常的点:org.springframework.orm.jpa.EntityManagerFactoryUtils public static DataAccessException convertJpaAccessExceptionIfPossible(RuntimeException ex) { // Following the JPA specification, a persistence provider can also // throw these two

404错误页面返回的状态码是200之严重性

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 最近在做网站的改版时发现站点的404错误页面是IIS的默认页面,内容很单调.为了提高网站的友好性,我便重新设计了一个404错误页面:接着,我便登录至A服务器 提供商的后台开始操作,准备更新该404错误页面. 在后台的整个操作还是很便捷的,A服务器提供商这块的用户体验确实做的不错!很快,我按照提示就完成了404错误页面的更新了.打开我网站的某一个页面,随便的在该域名后

httpclient提交一个请求返回的都是200的状态码,如何判断怎么是成功的怎么是失败的

问题描述 httpclient提交一个请求返回的都是200的状态码,如何判断怎么是成功的怎么是失败的 httpclient提交一个用于登录的请求,但是返回的都是200的状态码,如何判断怎么是成功的怎么是失败的呢? 解决方案 已解决,原因是由于学校的教务网出现问题了,才导致模拟不成功 解决方案二: 返回200说明在http层面都是成功的.你说的失败应该是指返回的数据中包含错误信息,那么你需要对返回的数据进行判断. 解决方案三: 如果返回的是200的话,那就是成功的!否则就是失败的! 解决方案四:

Nginx定义404页面并返回404状态码

WebServer是nginx,直接告诉我应该他们配置了nginx的404错误页面,虽然请求不存在的资源可以成功返回404页面,但返回状态码确是200. 404.html This is 404 page. 请求一个不存在的页面: ajax Code:  代码如下 复制代码 $.ajax({     url: "does_not_exist.html",     success : function(Response, textStatus){         console.log(