zoukankan      html  css  js  c++  java
  • 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();
            }
  • 相关阅读:
    【学习笔记】ASP.NET页面之间传值的方式之Application
    【学习笔记】ASP.NET页面之间传值的方式之QueryString
    【学习笔记】C#中的装箱(inboxing)和拆箱(unboxing)
    C# Func和Action用法以及区别和使用Lambda表达式
    构建ABP vNext项目并切换MySql数据库
    .Net FrameWork发布项目时报Microsoft.Net.Compilers is only supported on MSBuild v16.3 and above错误解决方案
    Docker容器与Linux主机环境获取时间不一致
    shell脚本中无法使用cd的问题解决方法
    Docker安装Mysql8.0,并配置忽略大小写
    Docker-Compose排版一些坑
  • 原文地址:https://www.cnblogs.com/jeffrey77/p/3226649.html
Copyright © 2011-2022 走看看