ASP.NET全局异常处理
Web项目部署后,异常直接暴露给用户会产生很不好的体验。只是暴露在服务器端又无法实时记录异常原因以便加以重现并修复。所以配合Log4Net记录日志信息,同时全局异常处理来营造良好用户体验就比较重要了。
在Web.config加以配置:
<httpModules>
<add name="ErrorModule" type="ErrorModule"/>
</httpModules>
早期开发时错误处理类放在App_Code里了,代码如下:
using System;
using System.Web; public class ErrorModule : IHttpModule
{
#region IHttpModule 成员 void IHttpModule.Dispose() { } void IHttpModule.Init(HttpApplication context)
{
context.Error += new System.EventHandler(context_Error);
} #endregion void context_Error(object sender, System.EventArgs e)
{
HttpContext context = HttpContext.Current;
Exception ex = context.Server.GetLastError();
String errorCode = Guid.NewGuid().ToString();
String errorMsg = ex.InnerException == null ? ex.GetBaseException().Message : ex.InnerException.Message;
//log4net.LogManager.GetLogger(GetType()).Error(BuildErrorString(errorCode, context));//Log4Netf辅助类
context.Server.ClearError();
ShowError(errorCode, errorMsg, context);
} private String BuildErrorString(string errorCode, HttpContext context)
{
Exception ex = context.Server.GetLastError();
System.Text.StringBuilder errorStr = new System.Text.StringBuilder();
if (ex != null)
{
errorStr.Append("{ErrorCode:");
errorStr.Append(errorCode);
errorStr.Append(",ErrorPage:");
errorStr.Append(context.Request.Url.ToString());
errorStr.Append(",ErrorMsg:");
errorStr.Append(ex.GetBaseException().Message);
errorStr.Append(",StackTrace:");
errorStr.Append(ex.StackTrace);
if (ex.InnerException != null)
{
errorStr.Append(",InnerErrorMsg:");
errorStr.Append(ex.InnerException.Message);
errorStr.Append(",InnerStackTrace:");
errorStr.Append(ex.InnerException.StackTrace);
}
errorStr.Append("}");
}
return errorStr.ToString();
} private void ShowError(string errorCode, string errorMsg, HttpContext context)
{
HttpResponse response = context.Response;
System.Text.StringBuilder errorPage = new System.Text.StringBuilder();
errorPage.Append("<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'/></head><body>");
errorPage.Append("<div style='margin:5px;border:1px solid #DDCCDD;padding:5px;'><p><strong>错误代码:</strong>");
errorPage.Append(errorCode);
errorPage.Append("</p><p><strong>错误消息:</strong>");
errorPage.Append(errorMsg);
errorPage.Append("</p><p><strong>系统异常请重试,若重复出现请联系系统管理员!</strong></p></div></body></html>");
response.Write(errorPage.ToString());
response.End();
response.Clear();
}
}
捕获异常记录日志并呈现自定义页面,同时保留错误代码和主要信息便于反馈给系统管理员。
ASP.NET全局异常处理的更多相关文章
- Global Error Handling in ASP.NET Web API 2(webapi2 中的全局异常处理)
目前,在Web API中没有简单的方法来记录或处理全局异常(webapi1中).一些未处理的异常可以通过exception filters进行处理,但是有许多情况exception filters无法 ...
- asp.net core添加全局异常处理及log4net、Nlog应用
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.介绍 此篇文章将会介绍项目的全局异常收集以及采用log4net或者NLog记录. 众所周知,一旦自己的项目报错,如果没有进行处 ...
- ASP.NET Core 中间件自定义全局异常处理
目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...
- ASP.NET Core 中间件的使用(三):全局异常处理机制
前言 我们经常听到"秒修复秒上线",觉得很厉害的样子. 其实不然,这只是一个调侃而已,出现问题的方式很多(逻辑漏洞.代码异常.操作方式不正确等). 我们今天来说代码异常问题怎么快速 ...
- .NET MVC全局异常处理(一)
目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...
- [整理]ASP.NET 中异常处理
[整理]ASP.NET 中异常处理 1.直接通过重写Controller的OnException来处理异常 public class HomeController : Controller { pub ...
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...
- 深入探究ASP.NET Core异常处理中间件
前言 全局异常处理是我们编程过程中不可或缺的重要环节.有了全局异常处理机制给我们带来了很多便捷,首先我们不用满屏幕处理程序可能出现的异常,其次我们可以对异常进行统一的处理,比如收集异常信息或者 ...
- 使用.NET 6开发TodoList应用(8)——实现全局异常处理
系列导航 使用.NET 6开发TodoList应用文章索引 需求 因为在项目中,会有各种各样的领域异常或系统异常被抛出来,那么在Controller里就需要进行完整的try-catch捕获,并根据是否 ...
随机推荐
- Wormholes 虫洞 BZOJ 1715 spfa判断负环
John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地 ...
- jQuery Validate验证框架详解(jquery.validate.min.js)
原博客 jQuery Validate验证框架详解 jQuery校验官网地址:https://jqueryvalidation.org/ 一.导入js库 <script type="t ...
- elementui bug ..
.el-menu { overflow: hidden !important;} element 菜单导航栏 会 超出 父组件一点..在组件中加上上边那句来隐藏!!!
- 链表 206 Reverse Linked List, 92,86, 328, 2, 445
表不支持随机查找,通常是使用next指针进行操作. 206. 反转链表 /** * Definition for singly-linked list. * struct ListNode { * i ...
- javascript的Astar版 寻路算法
去年做一个模仿保卫萝卜的塔防游戏的时候,自己写的,游戏框架用的是coco2d-html5 实现原理可以参考 http://www.cnblogs.com/technology/archive/2011 ...
- 尺取法 javascript算法
给定长度为n的数列整数a0,a1……an-1 以及整数S.求出总和不小于S的连续子序列的长度的最小值.如果解不存在,则输出0. 输入 n=10 S=15 a=[5,1,3,5,10,7,4,9,2,8 ...
- CSS2.1
学而时习之,不亦说乎! --<论语> CSS:cascading style sheet(层叠样式表) 作用:描述页面的样式. 书 ...
- rabbitmq 事务消息
事务消息主要用在发送方 在connection上加上事务属性, 发送方感知到本地事务执行失败, 需要通知broker将先前已经接收到的消息rollback,不要发给后面的消费者, 满足强一致性的要求 ...
- python 十大经典排序算法
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...
- rem.js的用法及在浏览器端的适配
首先介绍下自己,我是从后端转前端,对于前端的见识还不深望各位全当一个新手自述....... 随着移动设配的更新换代,市场上涌现了大量的非主流设备分辨率,比如华为手机...... 更新换代快的大前提下自 ...