ASP.NET MVC 全局异常
程序员文章站
2022-06-20 08:39:36
先新建一个过滤器ExceptionHandleErrorAttribute.cs 内容如下: 1 using System; 2 using System.Net; 3 using System.Web; 4 using System.Web.Mvc; 5 using ABBPMP.Utility. ......
先新建一个过滤器exceptionhandleerrorattribute.cs
内容如下:
1 using system; 2 using system.net; 3 using system.web; 4 using system.web.mvc; 5 using abbpmp.utility.nloghelper.static; 6 7 namespace abbpmp.filter 8 { 9 /// <summary> 10 /// 异常捕获(业务逻辑层,ui层) 11 /// </summary> 12 public class exceptionhandleerrorattribute : handleerrorattribute 13 { 14 /// <summary> 15 /// 错误拦截 16 /// </summary> 17 /// <param name="filtercontext"></param> 18 public override void onexception(exceptioncontext filtercontext) 19 { 20 21 if (filtercontext.exceptionhandled) 22 { 23 return; 24 } 25 26 27 28 string message = 29 $"消息类型:{filtercontext.exception.gettype().name}\r\n消息内容:{filtercontext.exception.message}\r\n引发异常的方法:{filtercontext.exception.targetsite}\r\n引发异常的对象:{filtercontext.exception.source}\r\n异常目录:{filtercontext.routedata.getrequiredstring("controller")}\r\n异常方法:{filtercontext.routedata.getrequiredstring("action")}\r\n错误详细记录:{filtercontext.exception.stacktrace}"; 30 nloghandler.instance.error(message); 31 if (!filtercontext.httpcontext.request.isajaxrequest()) 32 { 33 filtercontext.controller.viewdata.model = filtercontext.exception; 34 filtercontext.result = new viewresult 35 { 36 viewname = "~/views/error/error.cshtml", 37 viewdata = filtercontext.controller.viewdata 38 }; 39 } 40 filtercontext.result = ajaxerror(filtercontext.exception.message, filtercontext); 41 42 43 44 45 filtercontext.exceptionhandled = true; 46 } 47 /// <summary> 48 /// ajaxes the error. 49 /// </summary> 50 /// <param name="message">the message.</param> 51 /// <param name="filtercontext">the filter context.</param> 52 /// <returns>jsonresult</returns> 53 protected jsonresult ajaxerror(string message, exceptioncontext filtercontext) 54 { 55 56 //if message is null or empty, then fill with generic message 57 if (string.isnullorempty(message)) 58 message = "something went wrong while processing your request. please refresh the page and try again."; 59 //set the response status code to 500 60 filtercontext.httpcontext.response.statuscode = (int)httpstatuscode.internalservererror; 61 //needed for iis7.0 62 filtercontext.httpcontext.response.tryskipiiscustomerrors = true; 63 return new jsonresult 64 { 65 //can extend more properties 66 data = new ajaxexceptionmodel() { errormessage = message }, 67 contentencoding = system.text.encoding.utf8, 68 jsonrequestbehavior = jsonrequestbehavior.denyget 69 70 }; 71 72 } 73 /// <summary> 74 /// ajaxexceptionmodel 75 /// </summary> 76 public class ajaxexceptionmodel 77 { 78 /// <summary> 79 /// gets or sets the error message. 80 /// </summary> 81 /// <value> 82 /// the error message. 83 /// </value> 84 public string errormessage { get; set; } 85 86 } 87 88 } 89 }
然后在filterconfig添加
global.asax全局下添加
最后处理下ajax错误处理和服务器错误呈现形式
@{ viewbag.title = "general site error"; layout = "~/views/shared/_layout.cshtml"; } <div class="container"> <div class="row text-center"> <br/> <br /> <br /> <br /> <br /> <div class="col-md-6 col-md-offset-3 text-center"> @{ var exception = viewdata.model; var statuscode = exception == null ? 404 : 500; response.statuscode = statuscode; if (statuscode == 404) { <h1>404 page not found!</h1> <p>没有找到该网页!</p> } else if (statuscode == 500) { <h1>500 程序异常</h1> <p> <a class="btn" data-toggle="collapse" href="#collapseexample" role="button" aria-expanded="false" aria-controls="collapseexample"> error details </a> </p> <div class="collapse" id="collapseexample"> <div class="card card-body"> <p style="text-align: left;">消息类型:@exception.gettype().name<br />消息内容:@exception.message <br />引发异常的方法:@exception.targetsite <br />引发异常的对象:@exception.source<br />错误详细记录:@exception.stacktrace</p> </div> </div> } } <p style="font-size: 14px; color: gray">请使用浏览器的后退功能已保证您填写的数据没有丢失!</p> </div> </div> <div class="row text-center"> <div class="col-md-8 col-md-offset-2"> <h3> <i class="fa fa-lightbulb-o fa-5x"></i> </h3> <a href="@url.action("index","home")" class="btn">go to home page</a> </div> </div> </div>
$(document).ajaxerror(function (event, request, settings) { //request.responsetext if (request.responsetext != "") { var jsonvalue = jquery.parsejson(request.responsetext); } toastr.error("<li>settings.url:" + settings.url + "</li>" + "<li>request.status:" + request.status + "</li>" + "<li>request.statustext:" + request.statustext + "</li>" + "<li>errormessage:" + jsonvalue.errormessage + "</li>"); });
推荐阅读
-
ASP.NET第一次访问慢的解决方法(MVC,Web Api)
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(24)-权限管理系统-将权限授权给角色
-
asp.net core项目mvc权限控制:分配权限
-
asp.net core mvc权限控制:在视图中控制操作权限
-
详解使用asp.net mvc部分视图渲染html
-
详解ASP.NET MVC之下拉框绑定四种方式
-
详解ASP.NET MVC的筛选器
-
ASP.NET MVC重写RazorViewEngine实现多主题切换
-
[Asp.Net MVC4]验证用户登录实现实例
-
ASP.NET MVC下的四种验证编程方式[续篇]