• .NET WebAPI 利用特性捕捉异常


    声明:本方式及代码只使用与.NET Web API.

    先创建类继承ExceptionFilterAttribute类型并复写OnException方法。

    代码如下:

    using System;
    using System.IO;
    using System.Net.Http;
    using System.Text;
    using System.Web.Http.Filters;
    using FrameWork.Common;
    using FrameWork.Common.Const;
    
    namespace FrameWork.Web.Handle
    {
        /// <summary>
        /// 处理错误信息
        /// </summary>
        public class ErrorHandleAttribute : ExceptionFilterAttribute
        {
            public override void OnException(HttpActionExecutedContext filterContext)
            {
                // 错误处理
                base.OnException(filterContext);
                var sb = new StringBuilder();
                sb.AppendLine("参数:"+ GetExceptionMessage(filterContext));
                sb.AppendLine("异常内容:"+ filterContext.Exception.ToJson());
                Log4NetHelp.Error(sb.ToString());
                filterContext.Response = GetResponse(sb.ToString());
            }
    
            /// <summary>
            /// 处理错误信息为方便开发人员阅读的格式,包括接口地址以及参数
            /// </summary>
            /// <param name="actionExecutedContext">异常内容</param>
            private string GetExceptionMessage(HttpActionExecutedContext actionExecutedContext)
            {
                var session = System.Web.HttpContext.Current.Session;
                var request = System.Web.HttpContext.Current.Request;
                var guid = Guid.NewGuid().ToString();
                var task = actionExecutedContext.ActionContext.Request.Content.ReadAsStreamAsync();
                var content = string.Empty;
                try
                {
                    var sm = task.Result;
                    if (sm != null)
                    {
                        sm.Seek(0, SeekOrigin.Begin);
                        var len = (int)sm.Length;
                        var inputByts = new byte[len];
                        sm.Read(inputByts, 0, len);
                        sm.Close();
                        content = Encoding.UTF8.GetString(inputByts);
                        sm.Close();
                    }
                }
                catch (Exception e)
                {
                    return e.Message;
                }
    
                var sessionId = session == null ? "" : session.SessionID;
                var pars = string.Format("error:
     id = {3};
     sessionId = {0};
     url = {1};
     contentType = {4};
     content = {2};"
                    , sessionId
                    , request.RawUrl
                    , content
                    , guid
                    , request.ContentType);
    
                return pars;
            }
    
            /// <summary>
            /// 处理错误信息后执行的方法
            /// </summary>
            /// <param name="mes">错误信息</param>
            private HttpResponseMessage GetResponse(string mes)
            {
                return JsonHelper.ToJson(new
                {
                    Info = CommonConst.FailStr,
                    Message = mes,
                    Msg = false,
                    ResultCode = CommonConst.FailCode
                });
            }
        }
    }

    如何使用呢?

    只需要在需要捕捉异常的控制器加上[ErrorHandle]即可。

    例如:

        [ErrorHandle]
        public abstract class AdminControllerBase : Controller
        {
              //代码逻辑
        }

    如果继承AdminControllerBase或者带有[ErrorHandle]特性的类和方法出现了错误,都会执行OnException方法。

    可以在处理异常的方法里面加上自己想要的逻辑处理。

    也可以直接在WebApiConfig.cs文件中加上

     config.Filters.Add(new WebApiErrorHandleAttribute());

    这样就是全局捕捉异常了,只要接口内部没有try…catch,那么其他所有的异常都会捕捉到。

  • 相关阅读:
    5、Hystrix服务熔断(服务端)与服务降级(客户端)
    迷宫回溯问题
    4、负载均衡:Ribbon、Feign
    PHP-删除排序数组中的重复项
    MYSQL-连续出现的数字
    PHP
    MYSQL分数排名
    MYSQL查询第二高的薪水
    PHP算法之有效的括号
    PHP算法之电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/dawenyang/p/9228018.html
Copyright © 2020-2023  润新知