千家信息网

asp.net开发中常见的公共捕获异常方式有哪些

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要讲解了"asp.net开发中常见的公共捕获异常方式有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"asp.net开发中常见的公共捕获异
千家信息网最后更新 2025年01月16日asp.net开发中常见的公共捕获异常方式有哪些

这篇文章主要讲解了"asp.net开发中常见的公共捕获异常方式有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"asp.net开发中常见的公共捕获异常方式有哪些"吧!

1、BasePage类处理方式

在页面的公共基类里重写OnError事件。在前面这篇《asp.net实现非常实用的自定义页面基类》里,楼猪已经贴了代码,就不再费事了。根据经验,很多人开发的时候几乎都这么写,而且对调试和维护还是很有帮助的。需要说明的是,每新添一个页面,其对应类都必须继承自BasePage类异常处理才起作用。

2、Global.asax处理方式

如1中所述,BasePage类的异常处理要求每一个aspx类文件都继承它,适用性和性能显然会打折扣。而Global.asax文件定义了asp.net应用程序中的所有应用程序对象共有的方法、属性和事件,我们可以不采用BasePage的处理方式,在Global.asax里实现Application_Error事件并处理也可以。下面模仿BasePage类里的处理异常方法,实现如下:

/// /// 出错处理:写日志,导航到公共出错页面/// /// /// protected void Application_Error(object sender, EventArgs e){  if (Server.GetLastError() == null) return;  Exception ex = Server.GetLastError().GetBaseException();  string error = this.DealException(ex);  DotNet.Common.Util.Logger.WriteFileLog(error, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile");  if (ex.InnerException != null)  {    error = this.DealException(ex);    DotNet.Common.Util.Logger.WriteFileLog(error, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile");  }  this.Server.ClearError();  this.Response.Redirect("/Error.aspx");}/// /// 处理异常,用来将主要异常信息写入文本日志/// /// /// private string DealException(Exception ex){  this.Application["StackTrace"] = ex.StackTrace;  this.Application["MessageError"] = ex.Message;  this.Application["SourceError"] = ex.Source;  this.Application["TargetSite"] = ex.TargetSite.ToString();  string error = string.Format("URl:{0}\n引发异常的方法:{1}\n错误信息:{2}\n错误堆栈:{3}\n",    this.Request.RawUrl, ex.TargetSite, ex.Message, ex.StackTrace);  return error;}

上面方式的好处是,写一次代码,应用程序发生的大部分异常它都给你捕捉处理了。楼猪要在这里由衷地发一番感慨,感谢ms为我们提供了这么优秀的框架,太省事了吧。

3、IHttpModule接口处理

1和2的处理方式大家都是非常熟悉的,楼猪在实际开发中基本上都是遵循上面两种写法,而且楼猪因为有了2中这种大小通吃的处理方式,甚至已经激动地感谢ms了。但是,在asp.net程序调用线程进行异步处理的时候,容易发生在后台线程或线程池里抛出的异常并不能被1或(和)2完全捕捉到,这就涉及到asp.net下未捕获异常的处理。也就是说楼猪以前做过的很多大小项目中对异常的处理是不完备的。这难道是nc楼猪没有先谢国家种下的恶果吗?感谢国家,感谢ms,感谢博客园,感谢无私的xdjm,感谢自己......

asp.net下未捕获异常的处理步骤如下:

(1)、创建一个实现IHttpModule接口的类

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Text;namespace DotNet.Common.WebForm{  using DotNet.Common.Util;  ///   /// 通用未捕获异常处理   ///   public class AspNetUnhandledExceptionModule : IHttpModule  {    static object syncObj = new object();    static bool isInit = false;    public AspNetUnhandledExceptionModule()    {    }    #region IHttpModule Methods    public void Init(HttpApplication context)    {      lock (syncObj)      {        if (!isInit)        {          AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);          isInit = true;        }      }    }    public void Dispose()    {    }    #endregion    #region OnUnhandledException    void OnUnhandledException(object o, UnhandledExceptionEventArgs e)    {      if (e.ExceptionObject == null) return;      Exception ex = e.ExceptionObject as Exception;      string error = string.Format("引发异常的方法:{0}\n错误信息:{1}\n错误堆栈:{2}\n",              ex.TargetSite, ex.Message, ex.StackTrace);      Logger.WriteFileLog(error, AppDomain.CurrentDomain.BaseDirectory + "LogFile");    }    #endregion  }}

(2)、web.config节点配置

   

最后贴出测试代码:

protected void Page_Load(object sender, EventArgs e){  if (!IsPostBack)  {    System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(Test), null);  }}protected void Test(object state){  int[] numArr = new int[100];  numArr[100] = 100; //异常}

需要说明的是,通过线程或者线程池处理的程序,在发生异常时,每个线程都会有它自己独立的上下文,所以HttpContext对象应尽可能少地出现在异常处理阶段。

感谢各位的阅读,以上就是"asp.net开发中常见的公共捕获异常方式有哪些"的内容了,经过本文的学习后,相信大家对asp.net开发中常见的公共捕获异常方式有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

处理 方式 开发 线程 程序 常见 方法 错误 页面 事件 代码 信息 应用程序 学习 应用 内容 堆栈 大小 对象 接口 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 进销存软件开发需求文档 计算机终端服务器关系 奉贤区品牌软件开发定制价格 与wiley数据库类似的数据库 天下通达网络技术有限公司 咸宁网络技术培训怎么考 公司网络安全一年 搭载业务系统服务器管理权限 腾讯轻量级服务器不稳定 创意工坊服务器网址 三线城市 软件开发 转行 行政审批局网络安全培训制度 网络安全与法治教案 90后创建软件开发公司 南宁加固服务器生产厂商 查询fda医疗器械数据库 常见的数据库应用系统 管理股票的软件开发 网络安全大赛题库分几类 湖南自考计算机网络安全本科 山东八七互联网络安全公司 说出数据库的定义 万人云端共话网络安全 方球网络技术服务中心 如何创建数据库临时表空间 软件开发与信息技术哪个更好 数据库设计师是什么工作 学地质的怎么进软件开发 服务器为什么能接收数据 智能软件开发服务价格
0