/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • RSS订阅

ASP.NET MVC 统一化自定义异常处理方案的选择

2017-06-16 十有三 0 浏览:1149 .NET技术 ASP.NET MVC

去年很早的时候写过几篇关于ASP.NET MVC异常处理的方法和总结,后面遇到有网友留言,感觉在看过文章后虽然知道了多种全局异常处理的方案,但是在如何选择上出现了困惑,这里我就根据自己的一些项目经验来分析和说明下。

在ASP.NET MVC中,我所知的全局异常处理一共有三种方法:

  1. Global.asax的Application_Error事件
  2. ASP.NET MVC默认的HandleErrorAttribute特性
  3. 自己实现IExceptionFilter接口

博客咨询ASP.NET MVC 异常处理方案选择的评论

在仔细的细分,上面的三种全局异常处理的方法要排除掉HandleErrorAttribute特性,也就是只剩下Global.asax的Application_Error事件和实现IExceptionFilter这个异常过滤器接口,因为HandleErrorAttribute特性本来就是通过实现IExceptionFilter接口的一个异常过滤器,是官方默认提供的异常处理机制,方便一些只需要简单处理的异常捕获。

现在看就只剩下两种方式,大体上看没有什么不同,反正都可以做全局自定义异常处理。但是Application_Error事件存在一个严重的不足,这点也是IExceptionFilter接口存在的必要:Application_Error事件无法针对Action和Controller级别的异常做较好的切入处理!

举个简单的例子,某个业务逻辑复杂的项目,在某个控制器中的Action操作,一旦引发了特定的异常,需要根据异常类型跳转到不同的错误页面。如果使用Application_Error事件就十分不好处理,首先在全局异常处理中,我一般是不做太复杂的业务逻辑处理,通常就是做下错误日志记录,返回一些简单的错误信息,跳转通用的HTTP 500错误页面、HTTP 404页面或者提示信息较为友好的错误页面。逻辑不能太过复杂,不然代码侵入性太高了,会导致整个Global.asax十分臃肿。

我在项目中做全局异常处理,最主要目的是作为最后一道防线,捕捉项目中未进行过处理的异常。只是如果遇到对异常捕捉没有什么特别要求的项目,我也是直接用Application_Error来实现统一化自定义异常处理,这种情况就十分合适了,也比较方便。

但是一旦项目业务逻辑复杂的,对异常捕获等级有要求的,只能使用IExceptionFilter自己实现特定的异常过滤器接口,毕竟IExceptionFilter接口对Action和Controller级别的异常都可以轻松的切入处理,减少业务逻辑代码中大量的try catch块。

这里再举个业务例子,在某个项目中有个订单控制器:OrderController,假设只有一个删除订单的操作DeleteResult,再假设订单的业务逻辑般是十分复杂的,需要考虑的情况很多,比如删除的时候要判断订单是否能删除(用户是否有权限,订单是否被冻结,完成的订单禁止删除等),删除订单后商品库存如何操作等七七八八的问题。

这种情况下,一般如果出现异常,可不是简单的跳转到一个HTT P500错误页面就可以解决的,很多情况下都要预先编写自定义错误Exception来处理,根据DeleteResult这个Action抛出的不同异常,跳转到指定的错误页面中,方便操作人员进行后续处理。比如订单是因为被冻结的,在错误页面中肯定要显示详细的冻结原因,如何解决冻结操作,负责人的联系方式等等,需要进行哪些步骤,这些都不可能用通用模板和几句简单的错误信息就可以说明的。其他的像是用户没有权限的,商品库存数据同步失败等情况,都要专门的错误页面,这样操作人员才有办法进行下一步。

最后小结下,其实主要还是需求!根据自己项目的需求来选择不同的异常处理方式:

  1. 在项目中,如果不需要做复杂的异常捕获,考虑到SEO的(搜索引擎优化的),或者需要与旧项目兼容的,我一般也是直接用Global.asax的Application_Error事件来做处理,实现统一化自定义异常处理。
  2. 一些小型的后台管理类型的项目,我直接用HandleErrorAttribute特性,一般类似企业后台的项目都不怎么需要做SEO,毕竟是内部自己使用。
  3. 需要复杂的异常捕获,我一般是通过实现IExceptionFilter接口来编写自定义异常处理过滤器,另外这种方式对SEO也十分友好,只要注意对应的HTTP代码操作。不过有个缺点就是只能捕获Action方法抛出的异常,所以可能需要和其他异常处理方式进行搭配互补。

另外关于这几种异常处理机制的优缺点,贴下我2年前写的相关文章地址:

  • ASP.NET MVC实现IExceptionFilter接口编写自定义异常处理过滤器
  • ASP.NET MVC全局异常处理和捕获的思路
  • ASP.NET MVC 5 学习笔记:使用HandleErrorAttribute处理异常

其实优缺点大体上无外乎SEO,兼容性,复杂性,异常捕获范围,还有就是看需求!


版权声明:本文由十有三创作,采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请务必署名-保留作者名称及出处:https://shiyousan.com/post/636332087184242373。


  • 上一篇: 解决服务器80端口监听异常导致无法打开和访问网站的问题
  • 下一篇: ASP.NET MVC移除URL后面自动加上的AspxAutoDetectCookieSupport=1

相关文章
  • .Net Framework4.0 ashx页面报错:检测到有潜在危险的Request.Form值
  • 解决Visual Studio Community 2013中文语言包安装失败导致无法使用的问题
  • VS(Visual Studio)按键失灵无法按回车
  • ASP.NET 动态设置 HTTP 500 引发内部服务器错误
  • ASP.NET MVC使用HTML模板进行静态化操作
  • 网站打开出现 Server Error in '/' Application Validation of viewstate MAC failed
发表评论
记住昵称

文章分类

.NET技术 122 数据库 24 Web前端 21 网站建设运维 33 操作系统与应用 67 程序猿日常 11 开发工具 11 其他随笔 12

文章标签

ASP.NET ASP.NET MVC C# CSS HTML IIS Javascript Linux MongoDB MySql SQL SQL Server Visual Studio Windows系统 版本控制系统 插件工具 道学 佛经 服务器 搞笑娱乐 好文分享 软件应用 生活知识 诗词 手机问题 随笔 网络知识 网站设计优化 网站维护 养生保健 异常处理 硬件设备 游戏攻略

热门文章

  • 解决IE11安装升级失败和在安装前需要更新的问题
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • jquery ajax error函数和及其参数详细说明
  • 骑马与砍杀 无限箭枝/作弊修改箭枝数量/调整各种箭枝数量的方法
  • 在唯一密钥属性“fileExtension”设置为“.”时,无法添加类型为“mimeMap”的重复集合项

推荐文章

  • 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
  • SQL查询当前数据上一条和下一条的数据以实现获取文章上下篇文章信息
  • VS添加命名空间的快捷键
  • 随笔:阿里绿网方便但是有点小敏感
  • 研究百度分享自定义URL的BUG

最新评论

  • 感谢脖主分享
  • 在“为click once清单签名”的右侧,可以创
  • 用的帝国cms,修改后无效啊。 缓存清理了,浏览
  • 我的需求是:分享出去是同一个网站,但是微信分享需要
  • 试了 的确 有效,只能用english的语言进行安

友情链接

  • Wil的博客
  • Passingwind的博客
  • 坤哥网
  • .NET开发者社区

知识共享许可协议 CC BY-SA 4.0本站作品采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。
闽ICP备15003702号