예제 #1
0
        public void MessageFromResourceIsUsedIfAvailable()
        {
            var exception = new ErrorCodeException(CommonErrors.CouldNotLocateCommand);
            var userInfo  = this.SystemUnderTest.BuildUserInformation(exception, TestResouces.ResourceManager, "default message");

            Assert.Equal("You're insane!  You know that, right?", userInfo.Message);
        }
예제 #2
0
        public void MessageIsSetToDefaultIfNoneIsProvided()
        {
            var exception       = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);
            var expectedMessage = string.Format("{0} - {1}", CommonErrors.MissingApplicationConfiguration.FullIdentifier, CommonErrors.MissingApplicationConfiguration.ShortDescription);

            Assert.Equal(expectedMessage, exception.Message);
        }
예제 #3
0
        public void OnException(ExceptionContext context)
        {
            JsonResponses jsonResponses = JsonResponses.Failed.Clone();
            Exception     ex            = context.Exception;
            string        errMsg        = "Exception:" + ex.ToString();

            if (context.Exception.GetType() == typeof(ErrorCodeException))
            {
                ErrorCodeException errorCodeException = (ErrorCodeException)ex;
                //针对不同的自定义异常,做不同处理
                jsonResponses.code = errorCodeException.GetErrorCode();
                jsonResponses.msg  = errorCodeException.GetErrorMsg();
            }
            else if (context.Exception.GetType() == typeof(WebSocketException))
            {
                //针对不同的自定义异常,做不同处理
                WebSocketException errorCodeException = (WebSocketException)ex;
                jsonResponses.code = errorCodeException.ErrorCode;
                jsonResponses.msg  = errorCodeException.Message;
            }
            else if (context.Exception.GetType() == typeof(ArgumentException))
            {
                //针对不同的自定义异常,做不同处理
                ArgumentException errorCodeException = (ArgumentException)ex;
                jsonResponses.msg = errorCodeException.Message;
            }
            else
            {
                jsonResponses.msg = "系统错误";
            }
            context.Result           = new JsonResult(jsonResponses);
            context.ExceptionHandled = true;
            LogAgent.Error(errMsg + " " + JsonConvert.SerializeObject(jsonResponses));
        }
예제 #4
0
        public void ErrorCodeExceptionSetsFormattingObject()
        {
            var formattingObject = new { formatting = true, yes = "this has a value" };
            var exception        = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration, formattingObject);

            Assert.Equal(formattingObject, exception.FormattingObject);
        }
예제 #5
0
        public void InstanceIdentiferDifferentOnDifferentInstances()
        {
            var exception_one = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);
            var exception_two = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);

            Assert.NotEqual(exception_one.InstanceIdentifier, exception_two.InstanceIdentifier);
        }
예제 #6
0
        public void MessageFromResourceIsFormattedIfPossible()
        {
            var formattingObject = new { name = "Fozzy" };
            var exception        = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration, formattingObject);
            var userInfo         = this.SystemUnderTest.BuildUserInformation(exception, TestResouces.ResourceManager, "default message");

            Assert.Equal("Hello, Fozzy", userInfo.Message);
        }
예제 #7
0
 public ErrorResponseDto(ErrorCodeException exception, bool addStackTrace = false)
 {
     error             = exception.ErrorCode;
     _statusCode       = exception.GetStatusCode();
     error_description = exception.Message;
     error_uri         = _statusCode.GetStatusCodeUri();
     stack_trace       = addStackTrace ? exception.ToString() : null;
     state             = exception.State;
 }
예제 #8
0
        public void IfResourceManagerIsNullDefaultMessageIsReturnedWithErrorCodeInformation()
        {
            var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);
            var userInfo  = this.SystemUnderTest.BuildUserInformation(exception, null, "default message");

            Assert.Equal("default message", userInfo.Message);
            Assert.Equal(CommonErrors.MissingApplicationConfiguration.FullIdentifier, userInfo.Code);
            Assert.Equal(exception.InstanceIdentifier.ToString(), userInfo.Instance);
        }
예제 #9
0
        public void OnException(ExceptionContext filterContext)
        {
            // 异常时直接抛出500错误

            /*filterContext.HttpContext.Response =
             *  actionExecutedContext.Request.CreateResponse(HttpStatusCode.InternalServerError);*/
            var exception = filterContext.Exception as ErrorCodeException;

            // 路由相关的信息 (收集信息,暂时不需要记录所以注释该段代码)
            ////var route = actionExecutedContext.Request.GetRouteData().Route.RouteTemplate;
            ////var method = actionExecutedContext.Request.Method.Method;
            ////var url = actionExecutedContext.Request.RequestUri.AbsoluteUri;
            //var controllerName =filterContext.Request
            //    actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            //var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;

            // 业务模块抛出的异常信息

            if (exception == null)
            {
                // 系统系统时

                /*exception = new ErrorCodeException("500", actionExecutedContext.Exception.Message,
                 *          "SystemError!");*/
                exception = new ErrorCodeException("500", filterContext.Exception.Message,
                                                   filterContext.Exception)
                {
                    DisplayMessage = "SystemError!"
                };
            }

            // 写入head
            filterContext.HttpContext.Response.AddHeader("ApiCode", exception.ErrorCode);
            filterContext.HttpContext.Response.AddHeader("ApiMessage", exception.DisplayMessage);
            filterContext.HttpContext.Response.AddHeader("ApiVersion", "v2.0.0");


            // Write log

            /*var excptionMsg = exception.Message
             + (exception.InnerException != null ? ".InnerException:" + exception.InnerException.Message : string.Empty);*/

            var    excptionMsg = BuildMesageStack(exception);
            object actionName  = null;

            if (!filterContext.RouteData.Values.TryGetValue("action", out actionName))
            {
                actionName = "UNKNOW!";
            }

            Logger.Write(
                Log.Log_Type.Error,
                filterContext.Controller.GetType().Namespace,
                filterContext.Controller.GetType().FullName,
                actionName.ToString(),
                excptionMsg.ToString());
        }
예제 #10
0
        /// <summary>
        /// 使用 <see cref="LogLevel.Warning"/> 级别打印错误日志,并记录异常堆栈。
        /// </summary>
        /// <param name="logger">日志记录器的实例。</param>
        /// <param name="exception">错误码异常实例。</param>
        public static void LogWarningInfo(this ILogger logger, ErrorCodeException exception)
        {
            if (exception.ErrorCode < 50000)
            {
                throw exception;
            }

            var sb = new StringBuilder();

            sb.Append($"错误代码: {exception.ErrorCode},信息: {ErrorCodeHelper.GetMessage(exception.ErrorCode)}");
            sb.Append($"\n附加信息:\n {JsonConvert.SerializeObject(exception.AttachObject)}");
            logger.LogWarning(sb.ToString());
        }
예제 #11
0
        public void MessageIsSetIfItsProvided()
        {
            var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration, "It's a message");

            Assert.Equal("It's a message", exception.Message);
        }
 public void NoFormattingObjectMeansPropertyIsNull()
 {
     var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);
     Assert.Null(exception.FormattingObject);
 }
 public void MessageIsSetToDefaultIfNoneIsProvided()
 {
     var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);
     var expectedMessage = string.Format("{0} - {1}", CommonErrors.MissingApplicationConfiguration.FullIdentifier, CommonErrors.MissingApplicationConfiguration.ShortDescription);
     Assert.Equal(expectedMessage, exception.Message);
 }
 public void MessageIsSetIfItsProvided()
 {
     var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration, "It's a message");
     Assert.Equal("It's a message", exception.Message);
 }
 public void InstanceIdentifierNotEmpty()
 {
     var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);
     Assert.NotEqual(Guid.Empty, exception.InstanceIdentifier);
 }
 public void InstanceIdentiferDifferentOnDifferentInstances()
 {
     var exception_one = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);
     var exception_two = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);
     Assert.NotEqual(exception_one.InstanceIdentifier, exception_two.InstanceIdentifier);
 }
 public void ErrorCodeExceptionSetsFormattingObject()
 {
     var formattingObject = new { formatting = true, yes = "this has a value" };
     var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration, formattingObject);
     Assert.Equal(formattingObject, exception.FormattingObject);
 }
 public void ErrorCodeExceptionSetsErrorCode()
 {
     var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);
     Assert.NotNull(exception.ErrorCode);
 }
예제 #19
0
        /// <summary>
        ///     异常筛选器
        /// </summary>
        /// <param name="actionExecutedContext">异常类型</param>
        /// <param name="cancellationToken">取消标记</param>
        /// <returns>异步异常筛选器</returns>
        public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext,
                                                CancellationToken cancellationToken)
        {
            return(Task.Factory.StartNew(
                       () =>
            {
                // 路由相关的信息 (收集信息,暂时不需要记录所以注释该段代码)
                ////var route = actionExecutedContext.Request.GetRouteData().Route.RouteTemplate;
                ////var method = actionExecutedContext.Request.Method.Method;
                ////var url = actionExecutedContext.Request.RequestUri.AbsoluteUri;
                //var controllerName =
                //    actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
                //var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;

                // 业务模块抛出的异常信息
                var exception = actionExecutedContext.Exception as ErrorCodeException;
                if (exception == null)
                {
                    // 系统系统时

                    /*exception = new ErrorCodeException("500", actionExecutedContext.Exception.Message,
                     *  "SystemError!");*/
                    exception = new ErrorCodeException("500", actionExecutedContext.Exception.Message,
                                                       actionExecutedContext.Exception)
                    {
                        DisplayMessage = actionExecutedContext.Exception.Message
                    };
                }

                ILog log = LogManager.GetLogger(this.GetType().Name);
                // 写入head
                var head = new HeaderResponsetInfo
                {
                    ApiCode = exception.ErrorCode,
                    ApiMessage = exception.DisplayMessage,
                    ApiVersion = "v2.0.0"
                };
                try
                {
                    actionExecutedContext.Response.SetResponseHeadInfo(head);
                    ;
                }
                catch (Exception ex)
                {
                    var msg = BuildMesageStack(ex);
                    log.Error("拦截异常HttpHead信息:" + Json.Encode(head));
                    log.Error("拦截异常发生错误,原因:" + msg);
                }


                // 异常时直接抛出500错误 # 20151215 kk186 修改:异常拦截时统一向外返回200状态码
                actionExecutedContext.Response =
                    actionExecutedContext.Request.CreateResponse(HttpStatusCode.OK);
                actionExecutedContext.Response = actionExecutedContext.Request
                                                 .CreateResponse(HttpStatusCode.OK, new { code = head.ApiCode, msg = head.ApiMessage }, new JsonMediaTypeFormatter());


                // 使用log4net写入

                /*var excptionMsg = exception.Message
                 + (exception.InnerException != null ? ".InnerException:" + exception.InnerException.Message : string.Empty);*/

                var excptionMsg = BuildMesageStack(exception);

                excptionMsg.AppendLine("ErrorCode:" + exception.ErrorCode);
                excptionMsg.AppendLine("DisplayMessage:" + exception.DisplayMessage);
                log.Error(excptionMsg.ToString());

                // 使用ETM公用的日志写入
                Logger.Write(Log.Log_Type.Error, "WebApi_Exception_Filter:" + excptionMsg.ToString());
            },
                       cancellationToken));
        }
예제 #20
0
        public void InstanceIdentifierNotEmpty()
        {
            var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);

            Assert.NotEqual(Guid.Empty, exception.InstanceIdentifier);
        }
예제 #21
0
        public void ErrorCodeExceptionSetsErrorCode()
        {
            var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);

            Assert.NotNull(exception.ErrorCode);
        }
예제 #22
0
        public void NoFormattingObjectMeansPropertyIsNull()
        {
            var exception = new ErrorCodeException(CommonErrors.MissingApplicationConfiguration);

            Assert.Null(exception.FormattingObject);
        }