第三节:使用Log4net和过滤器记录异常信息,返回异常给前端

上次面试,遇到,在项目中如何处理业务异常和代码异常,使用txt记录异常信息后,如何直接区分出异常的类型,异常怎么分类处理,希望大家能帮我提出宝贵的意见,完善处理异常,

统一返回参数

复制代码
    public class HeaderResult
    {
        public HeaderResult()
        {
            // ReSharper disable once VirtualMemberCallInConstructor
            IsSucceed = false;
        }
    public virtual bool IsSucceed { get; set; }
   
    public virtual string Message { get; set; }
  
    public virtual T Result { get; set; }
   
    public virtual string StatusCode { get; set; }
}
</pre>
复制代码

创建一个过滤器

在过滤器中拦截异常信息,使用Log4net 记录日志到txt中,获取到异常信息统一返回给前端
复制代码
    public class ProjectExceptionFilter : IExceptionFilter
 {
    public void OnException(ExceptionContext context)
    {         
       Exception exception = context.Exception;
        var exceptionType = exception.GetType().ToString();
        if (exceptionType == "ProjectCore.Common.DomainException")
        {
            //用来分类处理业务逻辑
        }
        //获取controller的名称
        var controller = context.RouteData.Values["controller"].ToString();
        //获取Action的名称
        var action = context.RouteData.Values["Action"].ToString();
        var errorPath = controller + "/" + action;
        LogHelper.LogError("web service error:" + errorPath, exception);           
        //返回异常信息给前端
        context.Result = new JsonResult(new HeaderResult<string>
        {
            Message = "错误路径:" + errorPath + ":错误信息" + exception.Message+"",
            IsSucceed = false
        });         
        //异常已处理了
        context.ExceptionHandled = true;          
    }
}
</pre>
复制代码
使用Log4net 记录日志到txt中 log4net.config网上有许多,这里就不贴出来了
复制代码
    public static class LogHelper
{
    private static ILog _logger;

    static LogHelper()
    {
        ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository");
        XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));          
        LogHelper._logger = LogManager.GetLogger(repository.Name, "NETCorelog4net");
    }
    public static void LogError(string msg, Exception ex)
    {
        string errorMsg = string.Format("【抛出信息】:{0} <br/>【异常类型】:{1} <br/>【异常信息】:{2} <br/>【堆栈调用】:{3}", new object[] { msg,
        ex.GetType().Name, ex.Message, ex.StackTrace });
        errorMsg = errorMsg.Replace("\r\n", "<br>");
        errorMsg = errorMsg.Replace("位置", "<strong style=\"color:red\">位置</strong>");         
        LogHelper._logger.Error(errorMsg);
    }
    public static void LogInfo(string msg)
    {
        LogHelper._logger.Info((object)msg);
    }
    public static void LogDebug(string msg)
    {
        LogHelper._logger.Debug((object)msg);
    }
}
</pre>
复制代码
在Startup 下面配置
复制代码
       services.AddMvc(options =>
        {

            options.Filters.Add(typeof(ProjectExceptionFilter));              
            options.Filters.Add(typeof(ModelVerificationFilter));              
        }).
           SetCompatibilityVersion(CompatibilityVersion.Version_2_1).
            AddJsonOptions(options =>
            {
                //忽略循环引用
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                //不使用驼峰样式的key
                options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                //设置时间格式
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd";
            });
</pre>
复制代码
posted @   往事随灬锋  阅读(936)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示