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都能进行异常的获取,但是这种方式不太灵活,那么就看第二种方式

    第二种:控制器异常处理

    这种方式就在需要进行异常处理的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();
           }

    授权处理(获取客户端信息)

    public class SystemIAuthorizationFilter : IAuthorizationFilter
        {
            void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
            {
                //当前操作计算机用户 
                string pcName = ((System.Web.HttpServerUtilityWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Server).MachineName;
                //视图
                string action = ((System.Web.Mvc.ReflectedActionDescriptor)filterContext.ActionDescriptor).ActionName;
                //控制器
                string controller = ((System.Web.Mvc.ReflectedActionDescriptor)filterContext.ActionDescriptor).ControllerDescriptor.ControllerName;
                //请求时间
                string time = filterContext.RequestContext.HttpContext.Timestamp.ToString();
                //请求相对路径
                string absturl = ((System.Web.UnvalidatedRequestValuesWrapper)((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Request).Unvalidated).Url.AbsoluteUri;
                //状态
                string code = ((System.Web.HttpResponseWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Response).Status;
                // 浏览器版本
                string browser = ((System.Web.HttpBrowserCapabilitiesWrapper)((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Request).Browser).Type;
                //请求方式
                string gepPost = ((System.Web.HttpRequestWrapper)((System.Web.Mvc.Controller)filterContext.Controller).Request).RequestType;
                //本地主机名称解析DNS本身处理。
                string server = ((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.HttpContext).Request).UserHostAddress;
                #region  server 说明
                /*
                  * 版权(c)1993 - 2009微软(msft . o:行情)。
                  *
                  * 这是一个示例所使用的主机文件微软为Windows TCP / IP。
                  *
                  * 这个文件包含IP地址到主机名的映射。
                              每一个
                  * 条目应该保存在单个行。
                  IP地址应
                  *被放置在第一列对应的主机名。
                  *的IP地址和主机名应该由至少一个
                  *空间。
                  *
                  *此外,评论(这样的)可能是插入的个人
                  *线或后机器名称用“*”符号。
                  *
                  例如:
                  *
                  * 102.54.94.97 rhino.acme.com源服务器
                  * 38.25.63.10 x.acme.com x客户机主机
                  *本地主机名称解析DNS本身处理。
                  * 127.0.0.1 localhost
                  *::1 localhost
                  */
                #endregion
                //用户
                //部门
                //职位
     
            }
        }

    https://blog.csdn.net/zy0421911/article/details/54911712 MVC 自定义过滤器(Filter)实现路由控制、异常处理、授权处理(获取客户端信息)

  • 相关阅读:
    RealView MDK在链接时提示空间不够的解决方案总结
    不同的LCD之间程序移植时配置参考
    S3c2440ALCD控制器配置实例
    mini2440裸机之PWM
    对增益大于等于10时保持稳定的放大器进行补偿以在较低增益下工作
    ASP.NET HttpContext的时间戳属性
    C#验证邮箱,电话,手机,数字,英文,日期,身份证,邮编,网址,IP类.. (转)
    sqlhelper 实现回滚事务
    JQuery全选和反选
    js 获取前天、昨天、今天、明天、后天的时间 (转)
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/5475715.html
Copyright © 2011-2022 走看看