文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

springmvc错误处理机制是什么

2023-06-17 05:39

关注

这篇“springmvc错误处理机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springmvc错误处理机制是什么”文章吧。

1、首先要在  golable  文件的  protected void Application_Start()


注册一个错误处理机制。

MVC中自带一个  过滤器

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

springmvc错误处理机制是什么

这里面 我们看到这个过滤器

2、其实就是在 app_Start文件夹下面 的 FilterConfig.cs 文件

springmvc错误处理机制是什么

3、 打开FilterConfig.cs文件

就写了一个注册事件。我们看得到 这个是对错误处理机制

springmvc错误处理机制是什么

(当然 ,你们看到的是  HandleErrorAttribute 这个类)

4、所以你们可能觉得奇怪,我们来查看MyExceptionAttribut的定义看一下

springmvc错误处理机制是什么

继承了HandleErrorAttribute

这里我把这个类的代码贴一下


public class MyExceptionAttribute : HandleErrorAttribute     {         //  private static object obj = new object();         public static ConcurrentQueue<Exception> ExceptionQueue = new ConcurrentQueue<Exception>();//定义队列          /// <summary>         /// 在该方法中捕获异常。         /// </summary>         /// <param name="filterContext"></param>         public override void OnException(ExceptionContext filterContext)         {              base.OnException(filterContext);             Exception ex = filterContext.Exception;//捕获异常信息。             //将异常信息写到队列中。             ExceptionQueue.Enqueue(ex);             //跳转到错误页面.             filterContext.HttpContext.Response.Redirect("/Error.html");                      }     }

主要是定义一个静态 队列  ConcurrentQueue

(当然你也可以用 Queue。但是微软说 这个ConcurrentQueue 比 Queue  安全。好像是线程安全的,一堆堆的理论,说白了就是用ConcurrentQueue 更安全)

这样所有的错误就都在这个队列里面了。(就是内存)

这样总不行吧。内存 断电就没有了的啊。

所以我们要想把资料存到 硬盘中。

5、现在又要在

golable  文件的  protected void Application_Start()


中注册一个消费线程(这句话后面会解释,看不懂就继续)就是在 protected void Application_Start()中加入这些代码,***放最前面。

内容就是线程池开启一个线程 从刚刚定义的 MyExceptionAttribute的 ExceptionQueue队列里面取出项来。

将错误信息最加到文件后面。如果队列为空,就线程停留3秒。


string filePath = Server.MapPath("/Log/");             ThreadPool.QueueUserWorkItem((a) =>             {                  while (true)//注意:线程不能结束。后面写到队列中的数据没法处理。                 {      // 这里可以加一条   if (MyExceptionAttribute.ExceptionQueue.Count() > 0) //{  发送邮件到管理员}                     if (MyExceptionAttribute.ExceptionQueue.Count() > 0)                     {                         // Exception ex= MyExceptionAttribute.ExceptionQueue.Dequeue();//从队列中取出数据.                         Exception ex = null;                         bool isResult = MyExceptionAttribute.ExceptionQueue.TryDequeue(out ex);                         if (ex != null && isResult)                         {                             string fullPath = filePath + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";                             File.AppendAllText(fullPath, ex.ToString());                          //   ILog logger = LogManager.GetLogger("errorMsg");                           //  logger.Error(ex.ToString());                         }                         else                         {                             Thread.Sleep(3000);                         }                     }                     else                     {                         Thread.Sleep(3000);//避免造成CPU的空转。                     }                 }                 }, filePath);

6、总结。

这个就是一个生产者消费者的模式。

生产者就是 产生错误的源头。 消费者就是注册保存日志的方法。

中间有一个仓库就是    那个静态错误队列。

可以看到 系统产生的错误临时存放于内存中。然后一个新的线程 去读写静态错误队列。

正常情况 需要在错误队列里面加一个错误队列数字大于1000条的时候  发警告到邮箱的功能。那样感觉有点问题复杂化了,毕竟这里只是讲错误处理。

7、log4net 我前面讲过的一个开源框架 记录错误很好。

这里提供一个连接    log4net配置方法你可以把那个一起并到这里。那么就会有

把protected void Application_Start()中添加 的代码

改成。注意是改成:

log4net.Config.XmlConfigurator.Configure();             //开始一个线程,查看异常队列             string filePath = Server.MapPath("/Log/");             ThreadPool.QueueUserWorkItem((a) =>             {                  while (true)//注意:线程不能结束。后面写到队列中的数据没法处理。                 {                     if (MyExceptionAttribute.ExceptionQueue.Count() > 0)                     {                         // Exception ex= MyExceptionAttribute.ExceptionQueue.Dequeue();//从队列中取出数据.                         Exception ex = null;                         bool isResult = MyExceptionAttribute.ExceptionQueue.TryDequeue(out ex);                         if (ex != null && isResult)                         {                             string fullPath = filePath + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";                             //File.AppendAllText(fullPath, ex.ToString());                             ILog logger = LogManager.GetLogger("errorMsg");                             logger.Error(ex.ToString());                         }                         else                         {                             Thread.Sleep(3000);                         }                     }                     else                     {                         Thread.Sleep(3000);//避免造成CPU的空转。                     }                 }                 }, filePath);

这样就会按照你的要求把错误日志记录到

app_data文件夹下面。(前提是你有未处理的错误 。呵呵)

看到下图就成功了

springmvc错误处理机制是什么

以上就是关于“springmvc错误处理机制是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯