手机版

ASP .会员管理系统中异常例外拦截的深入理解

时间:2021-08-31 来源:互联网 编辑:宝哥软件园 浏览:

一、前言

由于客户端的环境不一致,有可能会造成我们预计不到的异常错误,所以在项目中,友好的异常信息提示,是非常重要的。在ASP。网最有价值球员中实现异常属性拦截也非常简单,只需要继承另一个类(系统网络。Mvc.FilterAttribute)和一个接口(系统网络。Mvc . IExceptionFilter),实现接口里面一个例外方法,或者直接继承手动音量调节提供的类系统网络。Mvc。HandleErrorAttribute。

下面话不多说了,来一起看看详细的介绍吧

二、实现关键逻辑

继承系统网络。Mvc.HandleErrorAttribute,重写了一个例外方法,主要实现逻辑代码如下:

公共类HandlerErrorAttribute : handlererattribute {///summary///控制器方法中出现异常,会调用该方法捕获异常////summary///param name=' context '提供使用/param公共覆盖void OnException(异常上下文上下文){写日志(上下文);基地OnException(上下文);语境. ExceptionHandled=trueif(上下文。异常是UserFriendlyException) {上下文.HttpContext。回应。statuscode=(int)HttpStatusCode .好的;语境。结果=新内容结果{内容=新AjaxResult {类型=结果类型。错误,消息=上下文。异常。消息}。to JSON()};} else if(上下文。异常是NoAuthorizeException) {上下文.HttpContext。回应。statuscode=(int)HttpStatusCode .未经授权;if(!语境HttpContext .请求。isajaxrequest()){ context .HttpContext。回应。redirecttorout(' Default ',新{控制器='Error ',操作='Error401 ',errorUrl=上下文.http上下文。请求。rawURl });} else { context .结果=新内容结果{内容=上下文http上下文。请求。rawURl };} } else { context .HttpContext。回应。statuscode=(int)HttpStatusCode .内部服务器错误异常消息错误=新异常消息(上下文。例外);var s=错误. to JSON();if(!语境HttpContext .请求。isajaxrequest()){ context .HttpContext。回应。redirecttorout(' Default ',新{控制器='Error ',操作='Error500 ',数据=WebHelper .UrlEncode });} else { context .结果=新内容结果{内容=网络助手UrlEncode };} } } ///摘要///写入日志(log 4 net)////summary///param name=' context '提供使用/param私有无效写日志(异常上下文上下文){ if (context==null)返回;如果(上下文。异常是NoAuthorizeException ||上下文。异常是UserFriendlyException) { //友好错误提示,未授权错误提示,记录警告日志日志助手.警告(上下文。异常。消息);} else { //异常错误,LogHelper .错误(上下文。例外);////TODO :写入错误日志到数据库} }}MVC过滤器全局注册异常拦截:

公共类过滤器配置{公共静态void RegisterGlobalFilters(GlobalFilterCollection filters){ filters .add(new HandlerErrorAttribute());} }我们看到,上下文。例外分为3种:UserFriendlyException,NoAuthorizeException或例外;用户异常友好化是指友好异常,前端友好提示错误信息NoAuthorizeException为401未授权异常,当页面未被授权访问时,返回该异常,并携带有未授权的路径地址。其他异常统一返回500错误,并携带异常信息。

三、异常处理

1.401 未授权错误

异常定义代码:

///摘要///没有被授权的异常////summarypublic类NoAuthorizeException :异常{ public NoAuthorizeException(字符串消息):底座(消息){ }}抛出异常代码:

引发新的NoAuthorizeException('未授权');前端用户界面效果:

2.404 未找到页面错误

手动音量调节的404异常处理,有几种方式,我们采用了在Global.asax全局请求函数中处理,请查看以下代码

受保护的void Application _ EndRequest(){ if(Context .回应。状态代码==404){ bool isAjax=new Httprequestwrapper(Context .请求)。IsAjaxRequest();if (isAjax) { Response .clear();回应。写(上下文请求。rawURl);} else { Response .重定向输出('默认',新{控制器='错误',操作='Error404 ',errorUrl=上下文.请求。rawURl });} } }前端用户界面效果:

3.500服务器内部错误

500异常错误抛出的异常信息对象定义:

///摘要///异常错误信息////摘要[Serializable]公共类异常消息{ public exception message(){ }///summary//构造函数///默认显示异常页面////summary ///param name='ex '异常对象/param公共异常消息(Exception ex): this(ex,true) { } ///summary ///构造函数////summary ///param name='ex '异常对象/param///param name=' isShowException '是否显示异常页面/param公共异常消息(异常ex,bool isShowException){ MsgType=ex .GetType().名称;消息=ex .InnerException!=null?前任。内部异常。消息: ex .消息;StackTrace=ex .长度300?前任。子串(0,300) : ex .StackTrace来源=ex .来源;时间=日期时间现在。至字符串(' yyyy-MM-DD hh :MM :s ');装配=ex .目标站点。模块。程序集。全名;方法=ex .目标站点。名称;ShowException=isShowExceptionvar请求=HttpContext .当前。请求;IP=网络知识产权。用户代理=请求用户代理.路径=请求。路径;HttpMethod=请求HttpMethod} ///摘要///消息类型////汇总公共字符串MsgType { get设置;} ///摘要///消息内容////汇总公共字符串消息{ get设置;} ///摘要///请求路径////摘要公共字符串路径{ get设置;} ///摘要///程序集名称////汇总公共字符串程序集{ get设置;} ///摘要///异常参数////摘要公共字符串ActionArguments { get设置;} ///摘要///请求类型////摘要公共字符串HttpMethod { get设置;} ///摘要///异常堆栈////摘要公共字符串StackTrace { get设置;} ///摘要///异常源////摘要公共字符串来源{ get设置;} ///摘要///服务器互联网协议(互联网协议)端口////摘要公共字符串IP { get设置;} ///摘要///客户端浏览器标识////摘要公共字符串UserAgent { get设置;} ///摘要///是否显示异常界面////summary public bool ShowException { get;设置;} ///摘要///异常发生时间////汇总公共字符串时间{ get设置;} ///摘要///异常发生方法////汇总公共字符串方法{获取设置;}}抛出异常代码:

引发新的异常(""出错了');前端用户界面效果:

4.用户异常友好化友好异常

异常定义代码:

///摘要///用户友好异常////summarypublic类用户友好异常:异常{ public UserFriendlyException(字符串消息):底座(消息){ }}在异常拦截关键代码中,我们发现友好异常(用户友好例外)其实是返回了一个结果对象AjaxResult,

AjaxResult对象的定义:

///摘要///表示埃阿斯操作结果////摘要公共类AjaxResult { ///摘要///获取埃阿斯操作结果类型////汇总公共结果类型类型{获取设置;} ///摘要///获取埃阿斯操作结果编码////summary public int错误代码{ get设置;} ///摘要///获取消息内容////汇总公共字符串消息{获取设置;} ///摘要///获取返回数据////摘要公共对象resultdata { get设置;} } ///摘要///表示创建交互式、快速动态网页应用的网页开发技术操作结果类型的枚举////摘要公共枚举结果类型{ ///摘要///消息结果类型////summary info=0,///summary ///成功结果类型////summary success=1,///summary ///警告结果类型////摘要警告=2,///摘要///异常结果类型////汇总错误=3 }四、Ajax请求异常时处理

在异常拦截的关键代码中,我们可以看到如果是ajax请求,会执行不同的逻辑,因为ajax请求不能直接通过MVC路由跳转,请求时必须返回结果内容

然后,在前端ajax方法中,返回的错误被统一处理。下面是我们项目中使用的ajax包,它统一处理异常错误。

(函数($) { '使用“严格”;$.httpCode={ success: '1 ',fail: '3 ',};//http通信异常的时候调用此方法$.httpErrorLog=function(msg){ console。日志('====='新日期().getTime()'=====');控制台。日志(msg);};//ajax请求错误处理$.httpError=函数(xhr,textStatus,Error throw){ if(xhr。status==401){ location。href='/错误/错误401?error URl=' xhr . responsetext } if(xhr。status==404){ location。href='/Error/Error 404?error URl=' xhr . responsetext } if(xhr。状态==500){位置。href='/错误/错误500?data=' xhr.responseText } }/*获取请求方法(异步): *网址地址,参数参数,回调回调函数发送前请求之前回调函数,完成请求完成之后回调函数* 考虑到得到请求一般将参数与全球资源定位器(统一资源定位符)拼接一起传递,所以将参数参数放置最后* 返回AjaxResult结果对象*/$.httpAsyncGet=函数(网址),回调、发送前、完成、参数){ $ .ajax({ url: url,data: param,type: 'GET ',dataType: 'json ',async: true,cache: false,success : function(data){ if($).isFunction(回调)))回调(数据);},错误:函数(XMLHttpRequest,textStatus,错误通过){ $ .httpError(XMLHttpRequest,textStatus,错误通过);},beforeSend:函数(){ if(!发送前)发送前();},complete: function () { if(!完成)完成();} });};/*获取请求方法(同步): *网址地址,参数参数* 返回实体数据对象*/$.httpGet=function (url,param){ var RES={ };$.ajax({ url: url,data: param,type: 'GET ',dataType: 'json ',async: false,cache: false,success :函数(data){ RES=data;},错误:函数(XMLHttpRequest,textStatus,错误通过){ $ .httpError(XMLHttpRequest,textStatus,错误通过);}, });返回RES };/*帖子请求方法(异步): *网址地址,参数参数,回调回调函数发送前请求之前回调函数,完成请求完成之后回调函数* 返回AjaxResult结果对象*/$.httpAsyncPost=函数(网址、参数、回调、发送前、完成){ $ .ajax({ url: url,data: param,type: 'POST ',dataType: 'json ',async: true,cache: false,success : function(data){ if($).isFunction(回调)))回调(数据);},错误:函数(XMLHttpRequest,textStatus,错误通过){ $ .httpError(XMLHttpRequest,textStatus,错误通过);},beforeSend:函数(){ if(!发送前)发送前();},complete: function () { if(!完成)完成();} });};/*帖子请求方法(同步): *网址地址,参数参数,回调回调函数* 返回实体数据对象*/$.httpPost=函数(网址、参数、回调){ $。ajax({ url: url,data: param,type: 'POST ',dataType: 'json ',async: false,cache: false,success : function(data){ if($).isFunction(回调)))回调(数据);},错误:函数(XMLHttpRequest,textStatus,错误通过){ $ .httpError(XMLHttpRequest,textStatus,错误通过);}, });},/* ajax异步封装: *型请求类型,url地址,参数参数,回调回调函数* 返回实体数据对象*/$.httpAsync=函数(类型、网址、参数、回调){ $。ajax({ url: url,data: param,type: type,dataType: 'json ',async: true,cache: false,success : function(data){ if($).isFunction(回调)))回调(数据);},错误:函数(XMLHttpRequest,textStatus,错误通过){ $ .httpError(XMLHttpRequest,textStatus,错误通过);}, });};})(jQuery);五、总结

至此,我们发现其实手动音量调节的异常处理,真的很简单,只需要在过滤器中全局注册之后,然后重写一个例外的方法,实现逻辑即可。关键是在于项目中埃阿斯请求,需要用统一的封装方法。

好了,这就是本文的全部内容。希望本文的内容对你的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

版权声明:ASP .会员管理系统中异常例外拦截的深入理解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。