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

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

2017-06-16 十有三 0 浏览:9760 .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

相关文章
  • 解决C#获取SQL的timestamp类型到程序中为byte[]类型的问题
  • 只允许一个 <configSections> 元素。它必须是根 <configuration> 元素的第一个子元素- HTTP Error 500.19
  • Discuz!NT Flash无法上传头像,点击上传后无任何反应
  • ASP.NET MVC 使用视图引擎实现页面静态化
  • 解决vs2010添加项目后解决方案资源管理器中没有显示解决方案的问题
  • 解决网站出现GET .woff 404 (Not Found)的问题

文章分类

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

文章标签

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

热门文章

  • IIS8如何安装和使用URL重写工具-URL Rewrite
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
  • VS重构重命名的快捷键

推荐文章

  • 如何暂停执行中的bat批处理文件?
  • .NET 使用HttpWebRequest 伪造Request.UrlReferrer
  • 解决bootstrap框架中Glyphicons字体图标无法显示
  • Javascript方法的覆盖和重写
  • ChinaPay.dll 64位系统导致应用程序池崩溃,异常代码: 0xc0000005

友情链接

  • Passingwind的博客
  • 码友网

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