/// <summary> /// 重写当API接口发生异常时 /// </summary> /// <param name="actionExecutedContext"></param> public override void OnException(HttpActionExecutedContext actionExecutedContext) { HttpError error = new HttpError(); if (actionExecutedContext.Exception is ValiDataException) { //数据验证错误 error.Message = HttpStatusCode.Forbidden.GetHashCode().ToString(); error.MessageDetail = actionExecutedContext.Exception.Message; throw new HttpResponseException( actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.OK, error)); } else if (actionExecutedContext.Exception is RequestIsNullException) { //提交的请求参数为空 error.Message = HttpStatusCode.BadRequest.GetHashCode().ToString(); error.MessageDetail = "提交的参数为空,请检查"; throw new HttpResponseException( actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.OK, error)); } else if (actionExecutedContext.Exception is DataNotFundException) { //未能通过指定的条件找到对应数据 例如通过ID找对应的信息 error.Message = HttpStatusCode.NotFound.GetHashCode().ToString(); error.MessageDetail = actionExecutedContext.Exception.Message; throw new HttpResponseException( actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.OK, error)); } else if (actionExecutedContext.Exception is NotImplementedException) { //调用了未实现的方法 error.Message = HttpStatusCode.NotImplemented.GetHashCode().ToString(); error.MessageDetail = actionExecutedContext.Exception.Message; throw new HttpResponseException( actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.OK, error)); } else if (actionExecutedContext.Exception is TimeoutException) { //已超时 error.Message = HttpStatusCode.GatewayTimeout.GetHashCode().ToString(); error.MessageDetail = "服务器已超时"; try { ExceptionLog.create(HttpStatusCode.GatewayTimeout, "服务器超时", actionExecutedContext.Exception.StackTrace); } catch { } throw new HttpResponseException( actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.OK, error)); } else { //其他都归结于 500 服务器错误 error.Message = HttpStatusCode.InternalServerError.GetHashCode().ToString(); error.MessageDetail = actionExecutedContext.Exception.Message; try { ExceptionLog.create(HttpStatusCode.InternalServerError, error.MessageDetail, actionExecutedContext.Exception.StackTrace); } catch { } throw new HttpResponseException( actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.OK, error)); } //base.OnException(actionExecutedContext); }