随笔 - 35  文章 - 0  评论 - 208 

之前我写过一篇关于ASP.NET全局异常处理的文章(http://www.cnblogs.com/snowdream/archive/2008/07/03/1234402.html)。在ASP.NET MVC中,进行异常处理变的更为简单。

方法一:重写OnException
在需要进行异常处理的Controller中重写OnException。如果整个程序都需要异常处理,可以先写一个BaseController,其他所有Controller都继承它,然后在BaseController中重写OnException。

 1protected override void OnException(ExceptionContext filterContext)
 2{
 3    // 此处进行异常记录,可以记录到数据库或文本,也可以使用其他日志记录组件。
 4    // 通过filterContext.Exception来获取这个异常。
 5    string filePath = @"D:\Temp\Exceptions.txt";
 6    StreamWriter sw = System.IO.File.AppendText(filePath);
 7    sw.Write(filterContext.Exception.Message);
 8    sw.Close(); 
 9
10    // 执行基类中的OnException
11        base.OnException(filterContext);
12
13    // 重定向到异常显示页或执行其他异常处理方法
14    Response.Redirect("/");
15}

 

方法二:添加ActionFilter
如果只是想针对某个Action使用异常处理那就不能重写Controller的OnException了的。但是我们可以先写一个ExceptionLogAttribute。

 1namespace Snowdream.Demo.MvcExceptionLogging
 2{
 3    public class ExceptionLogAttribute:HandleErrorAttribute
 4    {
 5        public override void OnException(ExceptionContext filterContext)
 6        {
 7            string filePath = @"D:\Temp\Exceptions.txt";
 8            StreamWriter sw = System.IO.File.AppendText(filePath);
 9
10
11            sw.Write(filterContext.Exception.Message);
12            sw.Close();
13
14            base.OnException(filterContext);
15
16            filterContext.HttpContext.Response.Redirect("/");
17        }

18    }

19}

20

然后在需要进行异常处理的Action前加上[ExceptionLog],如:

1[ExceptionLog]
2public ActionResult Index()
3{
4    ViewData["Message"= "Welcome to ASP.NET MVC!";
5
6    return View();
7}

8

示例下载

本文适用于 ASP.NET MVC 1.0
0
0
(请您对文章做出评价)
« 上一篇:在 Windows 7 中安装上网认证客户端
» 下一篇:在 Vista 中配置 Reporting Services 可能遇到的权限问题及其解决方法
posted on 2009-03-01 11:20 Snowdream 阅读(1794) 评论(8)  编辑 收藏 网摘 所属分类: ASP.NET

  回复  引用    
#1楼 2009-04-17 16:47 | John.Jiao[未注册用户]
不错,搬走
  回复  引用  查看    
#2楼 2009-04-20 19:59 | 只睡5小时      
学习了
  回复  引用    
#3楼 2009-04-24 10:40 | 式[未注册用户]
@John.Jiao
看不明白

  回复  引用  查看    
#4楼[楼主] 2009-04-24 17:00 | Snowdream      
@式
哪儿不明白?

  回复  引用    
#5楼 2009-04-30 10:35 | 风9999[未注册用户]
博主您好:
请教一个问题,自己写了一个仿PetShop的框架正在使用,一直想要完善一下,希望可能在底层一些层出现异常的时候,可以在前台提示出来,但是目前的框架比如在数据库执行语句时出现异常,由于底层try catch了,所有在UI层并没有任何效果,感觉就是命令没有执行一样,也没有任何错误,感觉调试起来很费功夫,必须要跟进去。您有什么比较好的解决方案吗?

  回复  引用  查看    
#6楼[楼主] 2009-04-30 19:35 | Snowdream      
一般来说我的做法是异常能在哪里被处理掉就在哪里catch~在开发和测试的时候IDE会帮助调试找到错误~应该也不是很麻烦吧~我也是通过IDE跟进去调试~UI显示自定义的错误页或是记录错误详细情况只是在正式运行的时候为了了解运行情况和记录一些未处理的异常以便下个版本进行处理~
  回复  引用    
#7楼 2009-05-04 08:57 | 风9999[未注册用户]
--引用--------------------------------------------------
Snowdream: 一般来说我的做法是异常能在哪里被处理掉就在哪里catch~在开发和测试的时候IDE会帮助调试找到错误~应该也不是很麻烦吧~我也是通过IDE跟进去调试~UI显示自定义的错误页或是记录错误详细情况只是在正式运行的时候为了了解运行情况和记录一些未处理的异常以便下个版本进行处理~
--------------------------------------------------------
不错,我就是为了让框架更趋向于产品方向,所以需要一些快速且面对客户的错误提示,当客户遇到错误的时候,会直接有类似alert的提示框提示具体错误和错误代码,然后便于客户反馈,我们可以根据平时积累的异常数据库快速提供解决方案。现在我的问题是,如何在非UI层,捕获到异常后,向UI层输出错误?多谢。

  回复  引用  查看    
#8楼[楼主] 2009-05-04 10:47 | Snowdream      
可以在上层捕捉下层的异常然后显示出来~或者通过返回值的方式来传递~如果要让客户便于反馈~还可以在异常处理时对异常进行记录~然后利用异常记录跟踪异常~