首页 新闻 会员 周边 捐助

WEBAPI 业务异常处理的问题

0
悬赏园豆:50 [已解决问题] 解决于 2019-07-24 11:00

在webapi框架下 业务异常处理问题,不知道发在这里合不合适。大家讨论下。

背景:webapi项目中 需要返回一直业务错误代码,比如说 code=1000 参数错误,code=2000 查找的订单不存在等等类似这样。这些有些错误代码 是在 业务层产生的。
返回的是一个统一对象

public sealed class ApiResponse<T>
{
    public string ReturnCode { get; set; }

    public string Message { get; set; }

    public T Data { get; set; }
}

我们之前的处理方式 是在业务层又定义了一个 类似于 ApiResponse 的统一返回对象,包含错误code 字段和返回值。这种方式 我觉得有点笨重,并导致业务层返回对象太重

于是采用了另一个方案,建立了一个 ErrorCodeException,

public class ErrorCodeException : Exception
{
    public ErrorCodeException(ReturnCodeEnum errorCode)
    {
        //。。。。
    }
}

如果业务层需要返回错误code,直接抛出 这个exception,然后再 exceptionFilter 中拦截这个exception,然后返回相应的 带错误code 的 ApiResponse

public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
    var exception = actionExecutedContext.Exception;
    string returnCode = ((int)ReturnCodeEnum.ERROR_UNKONW).ToString();
    try
    {
        if (exception is ErrorCodeException && exception.Data.Contains(AppConstants.EXCEPTION_DATA_KEY))
        {
            var errorCodeEnum =。。。。。
            }
    }
    catch
    {
    }
    var errorMsg = _optionsManager.GetMessage(returnCode);

    actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse<ApiResponse<string>>(
        HttpStatusCode.OK,
        new ApiResponse<string>() { ReturnCode = returnCode, Message = errorMsg });
}

这种方式 我认为 是在webapi项目中 处理业务错误code相对比较优雅的一种方式。

我的同事 坚决反对这种做法,提到异常 是 不可预测的 处理方式,不应该用这种方式
我认为是 可以存在一些可预知的 异常来做特定处理。

大家怎么看,或者 有一些处理业务层错误code返回的 好的方式 分享一下

gt1987的主页 gt1987 | 小虾三级 | 园豆:1150
提问于:2019-07-04 10:39

我们是这样做的 业务层和接口层都返回统一的RestReturnObject,业务层使用try——catch 捕获各种可能出现的异常,如果有直接返回RestReturnObject里面的失败对象信息。

曾将 5年前
< >
分享
最佳答案
1

我这边项目中用的也是你这种抛异常的方式。
以前的项目中,两种方式都用,但综合来看,还是简单的抛个自定义异常,然后在过滤器中统一处理更好。比起在接口中单独处理给后端增加的工作量,和不同后端接口处理方式的差异给前端带来的困扰以及由此引起的前后端撕逼,多抛几个异常所带来的那点性能损耗简直就是九牛一毛。换句话说,你是在提升团队的工作效率,相当于给公司省钱了。

收获园豆:50
韩宗泽 | 小虾三级 |园豆:681 | 2019-07-14 13:02
其他回答(2)
0

他有这么大意见,提出来什么解决方案? 如果没有,即便你提出来的是屎,也得用。况且还是种不错的方案

pencile | 园豆:845 (小虾三级) | 2019-07-04 15:50
0

你的这种方式就是我目前在用的,不管是.net项目中还是java项目中,都是这种方式。

Rolay | 园豆:324 (菜鸟二级) | 2019-07-12 17:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册