asp.net mvc异常处理的不同方法

第一种:全局异常处理

1.首先常见保存异常的类(就是将异常信息写入到文件中去)
    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类
    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.编写控制器,让其继承自上面的异常基类
   public class ExceptionController : BaseExceptionController
    {
        public ActionResult Index()
        {
            throw new Exception("我抛出异常了!");//这个是为了查看结果故意抛出的异常
        }
    }
通过上面的方式可以对整个控制器中的action都能进行异常的获取,但是这种方式不太灵活,那么就看第二种方式
 
 
第二种:控制器异常处理
1.这种方式就在需要进行异常处理的controller中重写OnException()方法即可,因为它本身继承了IExceptionFilter接口。
    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使用异常处理呢?那么我们就要用到下面的过滤器异常处理来进行
 
第三种:过滤器异常处理
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();
    }
}
 
第四种:路由异常处理
设置路由参数
 routes.MapRoute("ErrorHandling", "{*str}", new { controller = "Exception", action = "Missing" });
一定要放在所有配置的最下面、
       public ActionResult Missing(string str)
        {
            ViewData["ErrMsg"] = "您访问的页面出错了,"+str+" 时间:"+DateTime.Now.ToString();
            return View();
        }
 
第五种:动作异常处理
首先设置:
  <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();
        }
原文地址:https://www.cnblogs.com/jeffrey77/p/3226649.html