.NET MVC全局异常处理(二)

对上节的内容进行了补充

MVC过滤器Filter

MVC有四种过滤器:Authorization、Exception、Action、Result,我们要用的的就是Exception异常过滤器

当我们新建一个MVC项目后,异常过滤器就已经自动在程序中注册了,先从上一节所说的全局配置文件开始,Global.asax这个文件中的Application_Start方法会在程序启动时运行,其中的即默认注册了全局过滤器,如图

我们可以进入RegisterGlobalFilters方法查看,这个方法中默认注册了一个异常处理过滤器,也就是说默认状态的MVC程序发生异常时会被程序捕获处理,处理方式是跳转至错误页面,也就是上一篇文章说的Layout文件夹下面的Error页

但使用异常过滤器有一个大前提是要在Web.config中打开自定义错误处理的设置,customErrors节点要设置为“On”,这一设置默认是关闭的,也就是说要手动加上才行

  1. <system.web>
  2. <compilation debug="true" targetFramework="4.6.1"/>
  3. <httpRuntime targetFramework="4.6.1"/>
  4. <customErrors mode="On">
  5. </customErrors>
  6. </system.web>

需要注意的是 404 错误,这种类型的异常并不会被过滤器捕获

但是可以在web.config中添加节点进行自定义配置,跳转到相应的页面

  1. <customErrors mode="On">
  2. <error redirect="~/Error/NotFound" statusCode="404" />
  3. </customErrors>
  1. public class ErrorController : Controller
  2. {
  3. // GET: Error
  4. public ActionResult Index()
  5. {
  6. return View();
  7. }
  8. public ActionResult CustomHttpError()
  9. {
  10. ViewBag.Message = "有错误";
  11. //HandleErrorInfo
  12. //ExceptionContext
  13. return View();
  14. }
  15. public ActionResult NotFound()
  16. {
  17. return View();
  18. }
  19. }

自定义过滤器

MVC默认的异常过滤器可以满足基本的需要,但是如果要对一些异常进行特殊处理就需要我们自定义过滤器的内容,可以通过重写OnException方法达到这个目的

  1. public class CustomHandleErrorAttribute : HandleErrorAttribute
  2. {
  3. public override void OnException(ExceptionContext filterContext)
  4. {
  5. /* 调用基类的OnException方法,实现基础的功能。
  6. * 如果要完全的自定义,就不需要调用基类的方法
  7. */
  8. base.OnException(filterContext);
  9. /* 此处可进行记录错误日志,发送错误通知等操作
  10. * 通过Exception对象和HttpException对象可获取相关异常信息。
  11. * Exception exception = filterContext.Exception;
  12. * HttpException httpException = new HttpException(null, exception);
  13. */
  14. }
  15. }

示例代码

  1. public class MyErrorHandler : FilterAttribute, IExceptionFilter
  2. {
  3. public void OnException(ExceptionContext filterContext)
  4. {
  5. if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
  6. return;
  7. var statusCode = (int) HttpStatusCode.InternalServerError;
  8. if (filterContext.Exception is HttpException)
  9. {
  10. statusCode = filterContext.Exception.As<HttpException>().GetHttpCode();
  11. }
  12. else if (filterContext.Exception is UnauthorizedAccessException)
  13. {
  14. //to prevent login prompt in IIS
  15. // which will appear when returning 401.
  16. statusCode = (int)HttpStatusCode.Forbidden;
  17. }
  18. _logger.Error("Uncaught exception", filterContext.Exception);
  19. var result = CreateActionResult(filterContext, statusCode);
  20. filterContext.Result = result;
  21. // Prepare the response code.
  22. filterContext.ExceptionHandled = true;
  23. filterContext.HttpContext.Response.Clear();
  24. filterContext.HttpContext.Response.StatusCode = statusCode;
  25. filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
  26. }
  27. protected virtual ActionResult CreateActionResult(ExceptionContext filterContext, int statusCode)
  28. {
  29. var ctx = new ControllerContext(filterContext.RequestContext, filterContext.Controller);
  30. var statusCodeName = ((HttpStatusCode) statusCode).ToString();
  31. var viewName = SelectFirstView(ctx,
  32. "~/Views/Error/{0}.cshtml".FormatWith(statusCodeName),
  33. "~/Views/Error/General.cshtml",
  34. statusCodeName,
  35. "Error");
  36. var controllerName = (string) filterContext.RouteData.Values["controller"];
  37. var actionName = (string) filterContext.RouteData.Values["action"];
  38. var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
  39. var result = new ViewResult
  40. {
  41. ViewName = viewName,
  42. ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
  43. };
  44. result.ViewBag.StatusCode = statusCode;
  45. return result;
  46. }
  47. protected string SelectFirstView(ControllerContext ctx, params string[] viewNames)
  48. {
  49. return viewNames.First(view => ViewExists(ctx, view));
  50. }
  51. protected bool ViewExists(ControllerContext ctx, string name)
  52. {
  53. var result = ViewEngines.Engines.FindView(ctx, name, null);
  54. return result.View != null;
  55. }
  56. }

.NET MVC全局异常处理(二)的更多相关文章

  1. .NET MVC全局异常处理(一)

    目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...

  2. NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用

    NET MVC全局异常处理(一)   目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...

  3. Spring MVC 全局异常处理&文件上传

    Spring MVC 全局异常处理 使用SimpleMappingExceptionResolver实现异常处理 在welcome-servlet.xml进行如下配置: <bean class= ...

  4. MVC 全局异常处理及禁用显示头

    MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...

  5. Spring MVC全局异常处理与拦截器校检

    在使用Spring MVC进行开发时,总是要对系统异常和用户的异常行为进行处理,以提供给用户友好的提示,也可以提高系统的安全性. 拦截系统响应错误 首先是拦截系统响应错误,这个可以在web.xml中配 ...

  6. Android 全局异常处理(二)

    CrashHandler  package org.wp.activity; import java.io.File; import java.io.FileOutputStream; import ...

  7. MVC 全局异常处理(适用多人操作)

    自定义特性: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  8. Spring MVC全局异常处理

    继承HandlerExceptionResolver接口实现自己的处理方法,如: public class MyHandlerExceptionResolver implements HandlerE ...

  9. spring mvc 全局异常处理

    package com.tool; public class MyException extends Exception{ public String Msg; public String ErrCo ...

随机推荐

  1. Python爬虫入门教程 21-100 网易云课堂课程数据抓取

    写在前面 今天咱们抓取一下网易云课堂的课程数据,这个网站的数据量并不是很大,我们只需要使用requests就可以快速的抓取到这部分数据了. 你第一步要做的是打开全部课程的地址,找出爬虫规律, 地址如下 ...

  2. Solr 01 - 什么是Solr + Solr安装包目录结构说明

    目录 1 Solr概述 1.1 Solr是什么 1.2 Solr与Lucene的区别 2 Solr文件说明 2.1 Solr的目录结构 2.2 其他常用概念说明 2.3 创建基础文件目录 2.4 so ...

  3. spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例

    下面开始项目的搭建 使用 Java EE - Eclipse 新建一 Dynamic Web Project Target Runtime 选 Apache Tomcat 7.0(不要选 Apache ...

  4. Perl线程队列:Thread::Queue

    (Thread::Queue)队列数据结构(FIFO)是线程安全的,它保证了某些线程从一端写入数据,另一些线程从另一端读取数据.只要队列已经满了,写入操作就自动被阻塞直到有空间支持写操作,只要队列空了 ...

  5. 前端js 实现文件下载

    https://www.zhangxinxu.com/wordpress/2017/07/js-text-string-download-as-html-json-file/ 侵删 1.H5 down ...

  6. 后端开发者的Vue学习之路(四)

    目录 上节内容回顾: npm 介绍 安装 常用命令: 补充: 基于npm的Hello World 项目结构分析 用法迁移 小提醒 ES6语法 知识补充 单文件组件 使用注意: 路由 开启路由 定义路由 ...

  7. SAP MM 无价值物料管理的一种实现思路

    SAP MM 无价值物料管理的一种实现思路 笔者所在的项目,客户工厂处于先期试生产阶段,尚未开始大规模的商业化生产,但是这并不影响客户集团总部的SAP项目实施.笔者于7月初加入该工厂的第2期SAP项目 ...

  8. [python爬虫]Requests-BeautifulSoup-Re库方案--Requests库介绍

    [根据北京理工大学嵩天老师“Python网络爬虫与信息提取”慕课课程编写  文章中部分图片来自老师PPT 慕课链接:https://www.icourse163.org/learn/BIT-10018 ...

  9. 作为开发人员,这四类Code Review方法你都知道吗?

    本文翻译自:https://dzone.com/articles/4-types-of-code-reviews-any-professional-developer 转载请注明出处:葡萄城官网,葡萄 ...

  10. 二、IPC机制

    1.Android IPC简介 IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程. ANR:Applicatio ...