代码之家  ›  专栏  ›  技术社区  ›  Kenny Lucero

API控制器是否应尝试捕获所有500个内部服务器错误?

  •  0
  • Kenny Lucero  · 技术社区  · 6 年前

    很抱歉,如果有人问过这个问题,请把我和它联系起来。对于在api中捕获所有内部服务器错误(500)是否是一种可接受的做法,我很难找到讨论的答案。

    我看到有人赞成,也有人反对。 我一直听说,如果可能的话,应该发送一个状态而不是错误。然而,我确实看到了500是如何语义上为一个失败的请求负责,并让客户知道他们的请求可能不是错误的。但是一个状态也可以传达这一点,然后500只保留给应用程序容器级错误,而不是数据库或类库中的错误。

    有公认的标准吗?还是这是一个观点话题?

    例如

    public HttpResponseMessage GetUserRoles()
    {
        try
        {
            return Request.CreateResponse(HttpStatusCode.OK, AuthorizationService.GetUserRoles());
        } 
        catch (SqlException sqle)
        {
            // log the exception
            return Request.CreateResponse(HttpStatusCode.BadRequest, "A data error occured. Contact IT Support.");
        }
        catch (Exception e)
        {
            // log the exception
            return Request.CreateResponse(HttpStatusCode.BadRequest, "An error occured. Contact IT Support.");
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Victor Hugo Terceros    6 年前

    一个好的做法是总是返回相同的结构

     public interface IResponse<T>
        {
            MsgType MsgType { get; }
            string Msg { get; }
            T Result { get; }
            string Origin { get; }
        }
    

    然后你可以有一个 万事达控制器 用这些方法

    [NonAction]
    public IHttpActionResult ResponseOk<T>(T result)
    {
         return Ok<IResponse>(ResponseFactory.Create<T>(result, "", "Negocio"));
    }
    
    [NonAction]
    public IHttpActionResult ResponseEx(Exception ex, string msg = "Un error ha ocurrido.")
    {
         return ResponseMessage(Request.CreateResponse<IResponse>(HttpStatusCode.InternalServerError, ResponseFactory.Create(msg, ex, "Negocio")));
    }
    

    在继承主控制器的控制器中,你称之为

    [HttpGet]
    [Route("Api/Alumno/Search")]
    public dynamic Search(string codigo, string nombre, string estado, int? curso, int? paralelo)
    {    
        return ResponseOk<dynamic>(result);
    }
    

    对于所有不受控制的异常,您都可以有一个操作过滤器来管理它们

    public class ErrorLoggingFilter : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            //Exception
        }
    }