ASP.NET mvc异常处理的方法

ASP.NET mvc异常处理的方法

第一种:全局异常处理

1.首先常见保存异常的类(就是将异常信息写入到文件中去)

  •  
  • C# 代码   复制
  • 
    public class LogManager
    
       {
    
           private string logFilePath = string.Empty;
    
           public LogManager(string logFilePath)
    
           {
    
               this.logFilePath = logFilePath;
    
               FileInfo file = new FileInfo(logFilePath);
    
               if (!file.Exists)
    
               {
    
                   file.Create().Close();
    
               }
    
    
           }
    
           public void SaveLog(string message, DateTime writerTime)
    
           {
    
               string log = writerTime.ToString() + ":" + message;
    
               StreamWriter sw = new StreamWriter(logFilePath, true);
    
               sw.WriteLine(log);
    
               sw.Close();
    
           }
    
       }
    
    		
  • 2.编写一个异常的基类让其继承自controller类

  •  
  • C# 代码   复制
  • 
    public class BaseExceptionController : Controller
    
       {
    
           protected override void OnException(ExceptionContext filterContext)
    
           {
    
               LogManager logManager = new LogManager(Server.MapPath("~/Exception.txt"));
    
               logManager.SaveLog(filterContext.Exception.Message, DateTime.Now);
    
               base.OnException(filterContext);
    
           }
    
       }
    
    		
  • 3.编写控制器,让其继承自上面的异常基类

  •  
  • C# 代码   复制
  • 
    public class ExceptionController : BaseExceptionController
    
       {
    
           public ActionResult Index()
    
           {
    
               throw new Exception("我抛出异常了!");//这个是为了查看结果故意抛出的异常
    
           }
    
       }
    
    		
  • 通过上面的方式可以对整个控制器中的action都能进行异常的获取,但是这种方式不太灵活,那么就看第二种方式

    第二种:控制器异常处理

    这种方式就在需要进行异常处理的controller中重写OnException()方法即可,因为它本身继承了IExceptionFilter接口

  •  
  • C# 代码   复制
  • 
    public class ExceptionController : Controller
    
       {
    
           public ActionResult Index()
    
           {
    
               throw new Exception("我抛出异常了!");
    
           }
    
           protected override void OnException(ExceptionContext filterContext)
    
           {
    
               string filePath = Server.MapPath("~/Exception。txt");
    
               StreamWriter sw = System.IO.File.AppendText(filePath);
    
               sw.WriteLine(DateTime.Now.ToString() + ":" + filterContext.Exception.Message);
    
               sw.Close();
    
               base.OnException(filterContext);
    
               Redirect("/");
    
           }
    
       }
    
    		
  • 前面两种都是在controller中重写OnException方法,这样只要controller中又异常,那么就会被捕捉并被处理,但是如果我们要针对某个action使用异常处理呢?那么我们就要用到下面的过滤器异常处理来进行。

    第三种:过滤器异常处理

  •  
  • C# 代码   复制
  • 
    namespace MyMVC.Controllers
    
    {
    
       public class ExceptionController : Controller
    
       {
    
           [Error]
    
           public ActionResult Index()
    
           {
    
               throw new Exception("过滤器异常!");
    
           }
    
       }
    
    }
    
    public class ErrorAttribute : HandleErrorAttribute
    
    {
    
       public override void OnException(ExceptionContext filterContext)
    
       {
    
           base.OnException(filterContext);
    
           string path = filterContext.HttpContext.Server.MapPath("~/Exception.txt");
    
           StreamWriter sw = System.IO.File.AppendText(path);
    
           sw.WriteLine(DateTime.Now.ToString()+":"+filterContext.Exception.Message);
    
           sw.Close();
    
       }
    
    }
    
    		
  • 第四种:路由异常处理

  •  
  • C# 代码   复制
  • 
    //设置路由参数
    
    routes.MapRoute("ErrorHandling", "{*str}", new { controller = "Exception", action = "Missing" });
    
    //一定要放在所有配置的最下面、
    
    public ActionResult Missing(string str)
    
           {
    
               ViewData["ErrMsg"] = "您访问的页面出错了,"+str+" 时间:"+DateTime.Now.ToString();
    
               return View();
    
           }
    
    		
  • 第五种:动作异常处理

  •  
  • C# 代码   复制
  • 
    //首先设置:
    
     <system.web>
    
       <customErrors mode="On">
    
         <error statusCode="404" redirect="/Exception/Missing"/>
    
       </customErrors>
    
       
    
     </system.web>
    
           public ActionResult Missing(string str)
    
           {
    
               ViewData["ErrMsg"] = "您访问的页面出错了,"+str+" 时间:"+DateTime.Now.ToString();
    
               return View();
    
           }
    
    		
  • 标签: