/// <summary> /// 推送异常队列 /// </summary> /// <param name="ex">异常</param> /// <param name="queueMessage">队列消息</param> /// <param name="desc">描述</param> /// <returns>是否推送成功</returns> protected bool PublishExceptionQueue(Exception ex, object queueMessage, string desc = null) { if (BusinessExceptionProducer == null) { return(BusinessExceptionReturnAck); } string queueMessageJson = null; if (queueMessage != null) { queueMessageJson = JsonUtil.SerializeIgnoreNull(queueMessage); } var busEx = new BusinessExceptionInfo() { Time = DateTime.Now, ServiceName = AppConfig["MessageQueue:Consumer:ServiceName"], ExceptionString = ex.ToString(), ExceptionMessage = ex.Message, Exchange = rabbitMessageQueueInfo.Exchange, Queue = rabbitMessageQueueInfo.Queue, QueueMessageJsonString = queueMessageJson, Desc = desc, ServerMachineName = Environment.MachineName, ServerIP = NetworkUtil.LocalIP }; BusinessExceptionProducer.Publish(busEx, BusinessExceptionProducerRouteKey); return(true); }
/// <summary> /// 处理业务异常 /// </summary> /// <param name="businessException">业务异常</param> /// <returns>是否处理成功</returns> public bool Handle(BusinessExceptionInfo businessException) { if (businessException == null || dicExceptionHandleProducers.IsNullOrCount0()) { return(false); } foreach (var item in dicExceptionHandleProducers) { item.Key.Publish(businessException, item.Value); } return(true); }
/// <summary> /// Raises the exception event. /// </summary> /// <param name="context">The context for the action.</param> public override void OnException(HttpActionExecutedContext context) { // --- Log this information to the trace log var logItem = new TraceLogItem { Type = TraceLogItemType.Error, OperationType = "WebAPI", Message = "Exception", DetailedMessage = context.Exception.ToString() }; Tracer.Log(logItem); var businessEx = context.Exception as BusinessOperationException; if (businessEx != null) { // --- This is a business issue var info = new BusinessExceptionInfo { reasonCode = businessEx.ReasonCode, isBusiness = true, message = businessEx.Message, errorObject = businessEx.Notifications.Items }; throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent(JsonConvert.SerializeObject(info)) }); } // --- This is an infrastructure issue var infraInfo = new InfrastructureExceptionInfo { reasonCode = "Unexpected", isBusiness = false, message = context.Exception.Message }; throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent(JsonConvert.SerializeObject(infraInfo)) }); }
/// <summary> /// 生成业务异常信息 /// </summary> /// <param name="ex">异常</param> /// <param name="queueMessage">队列消息</param> /// <param name="amqpQueue">AMQP队列信息</param> /// <param name="log">日志</param> /// <param name="desc">描述</param> /// <returns>业务异常信息</returns> public static BusinessExceptionInfo BuilderBusinessException(Exception ex, object queueMessage, AmqpQueueInfo amqpQueue, ILogable log, string desc = null) { if (log == null) { throw new ArgumentNullException("日志不能为null"); } string queueMessageJson = null; if (queueMessage != null) { try { queueMessageJson = queueMessage.ToJsonString(); } catch (Exception ex1) { log.ErrorAsync("JSON序列化业务异常信息出错", ex1, typeof(AmqpUtil).Name); return(null); } } var busEx = new BusinessExceptionInfo() { ExId = snowflakeId.New(), HostId = amqpQueue.HostId, Time = DateTime.Now, ServiceName = string.IsNullOrWhiteSpace(amqpQueue.ExceptionHandle.ServiceName) ? App.AppServiceName : amqpQueue.ExceptionHandle.ServiceName, ExceptionString = ex.ToString(), ExceptionMessage = ex.Message, Exchange = amqpQueue.ExchangeName, Queue = amqpQueue.Queue.Name, QueueMessageJsonString = queueMessageJson, Desc = desc, ServerMachineName = Environment.MachineName, ServerIP = NetworkUtil.LocalIP }; return(busEx); }