毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里。所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命。下面我们主要讨论的是如何捕捉全局的异常。基本上在winform或web中捕获全局异常的思路都是一样的,在全局的应用程序对象中添加异常捕获的代码,并写入日志文件中。

一.在Winform程序中捕获全局异常

在winfrom中我们需要了解Application对象中的两个事件

Application.ThreadException 事件--UI线程中某个异常未被捕获时出现。

AppDomain.UnhandledException 事件--非UI线程中某个异常未被捕获时出现。

我们需要在Program.cs中设置异常的捕捉代码(如下图所示)。LogHelper类是自定义的日志帮助类,在前面的几篇文章中已经有涉及到。

需要在Program.cs中添加的代码如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Text;
using Common;namespace testLog4N
{static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>
        [STAThread]static void Main(){BindExceptionHandler();//绑定程序中的异常处理
            Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1());}/// <summary>/// 绑定程序中的异常处理/// </summary>private static void BindExceptionHandler(){//设置应用程序处理异常方式:ThreadException处理
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);//处理UI线程异常Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);//处理未捕获的异常AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);}/// <summary>/// 处理UI线程异常/// </summary>/// <param name="sender"></param>/// <param name="e"></param>static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e){LogHelper.ErrorLog(null, e.Exception as Exception);}/// <summary>/// 处理未捕获的异常/// </summary>/// <param name="sender"></param>/// <param name="e"></param>static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e){LogHelper.ErrorLog(null, e.ExceptionObject as Exception);}}
}

示例性代码下载

二、在Web中捕获全局异常

我们只需要在Global.asax文件中添加异常捕获的代码即可。

完整Global.asax代码如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using Common;namespace WebApplication_testLog4Net
{public class Global : System.Web.HttpApplication{void Application_Start(object sender, EventArgs e){// 在应用程序启动时运行的代码
}void Application_End(object sender, EventArgs e){//  在应用程序关闭时运行的代码
}void Application_Error(object sender, EventArgs e){// 在出现未处理的错误时运行的代码Exception objExp = HttpContext.Current.Server.GetLastError();LogHelper.ErrorLog("<br/><strong>客户机IP</strong>:" + Request.UserHostAddress + "<br /><strong>错误地址</strong>:" + Request.Url , objExp);}void Session_Start(object sender, EventArgs e){// 在新会话启动时运行的代码
           }void Session_End(object sender, EventArgs e){// 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。
}}
}

示例程序下载

三、在WPF中捕获全局异常

我们只需要在App.xaml文件中添加异常捕获的代码即可。

在WPF中捕获全局异常主要涉及到以下两个事件

1、AppDomain.UnhandledException 事件--当某个异常未被捕获时出现。主要指的是非UI线程。

2、Application.DispatcherUnhandledException 事件--如果异常是由应用程序引发,但未处理,发生。主要指的是UI线程。

完整的App.xaml文件如下所示

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
using Common;namespace WpfApplication1
{/// <summary>/// App.xaml 的交互逻辑/// </summary>public partial class App : Application{public App(){this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);}void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e){if (e.ExceptionObject is System.Exception){LogHelper.ErrorLog(null, (System.Exception)e.ExceptionObject);}}public static void HandleException(Exception ex){LogHelper.ErrorLog(null,ex);}void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e){e.Handled = true;LogHelper.ErrorLog(null, e.Exception);}}
}

示例代码下载

转载于:https://www.cnblogs.com/kissazi2/p/3393151.html

在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常相关推荐

  1. python捕获全局异常统一管理_python中如何用sys.excepthook来对全局异常进行捕获、显示及输出到error日志中...

    使用sys.excepthook函数进行全局异常的获取. 1. 使用MessageDialog实现异常显示: 2. 使用logger把捕获的异常信息输出到日志中: 步骤:定义异常处理函数, 并使用该函 ...

  2. 计算机网络系统中常用的四对双绞线电缆,计算机网络中常用的三种有线传输媒体是什么?...

    计算机网络中常用的三种有线传输媒体是双绞线.同轴电缆.光纤.双绞线是一种综合布线工程中最常用的传输介质:同轴电缆是指有两个同心导体,而导体和屏蔽层又共用同一轴心的电缆:光纤是一种由玻璃或塑料制成的纤维 ...

  3. VS中安装DevExpress后在Winform的工具箱中不显示控件

    场景 DevExpress14以及注册机下载 https://download.csdn.net/download/badao_liumang_qizhi/11608734 DevExpress18安 ...

  4. 在C#代码中应用Log4Net系列教程(附源代码)

    Log4Net应该可以说是DotNet中最流行的开源日志组件了.以前需要苦逼写的日志类,在Log4Net中简单地配置一下就搞定了.没用过Log4Net,真心不知道原来日志组件也可以做得这么灵活,当然这 ...

  5. 在ASP.NET MVC中使用Log4Net记录异常日志,出错时导向到静态页

    本篇体验在ASP.NET MVC 4中使用Log4Net记录日志. 通过NuGet安装Log4Net. 需求是:当出错时导向到Error.html静态页面,Log4Net记录错误信息. 大致的思路是: ...

  6. 照相四个人c语言,四个人照相有几中姿势的图片 | 手游网游页游攻略大全

    发布时间:2017-09-22 奇迹暖暖梦恋奇迹第四期攻略 奇迹暖暖梦恋奇迹第四期攻略 梦中的婚礼.花雨誓约一览.下面蚕豆网小编就给大家带来这篇攻略,大家一起来看看吧. 在烟火灿烂的爱情圣地赫拉维,与 ...

  7. 在C#代码中应用Log4Net(一)简单使用Log4Net

    首先让我们先把Log4Net跑起来,示例代码在文章最后面可以下载 1.先把Log4Net引入到工程中,为了演示方便,我们先建立一个winform程序.在程序的根目录下面,建立一个Libs文件夹,以便存 ...

  8. 在C#代码中应用Log4Net 中配置文件的解释

    一个完整的配置文件的例子如下所示,这个是"在C#代码中应用Log4Net(二)"中使用的配置文件. <log4net><!-- 错误日志类--><lo ...

  9. 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用

    前面的几篇文章已经比较完整地解释了怎么使用Log4Net,但是我们可能需要将Log4Net的日志类封装在自己的类库中,以便C/S或B/S程序进行调用.下面的示例程序简单地分为两层,一个是应用程序层We ...

最新文章

  1. SpringCloud成长之路 一 注册与发现(Eureka)
  2. MicroProfile 1.2新增功能介绍
  3. 计组之中央处理器:3、数据通路(单总线结构、专用通路结构)
  4. redis的zset的底层实现_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理...
  5. java指定sql生成xml_通过generate解析SQL日志生成xml进行SQL回放
  6. java -jar 怎么停止_图解Java日志体系
  7. 边缘计算工作负载:虚拟机,容器还是裸机?
  8. 设计模式-适配器模式(Adapter)
  9. FullCalendar - 开源的多功能 JavaScript 日历插件
  10. Keil编译出现 “no source“: Error: command-line: #564: cannot open解决方法
  11. 苹果x屏幕多少钱_xsmax闪屏,苹果xsmax换屏幕多少钱
  12. 随机出现“No result defined for action ....Action and result input”解决
  13. win10重装应用商店
  14. 配置java win10_win10 Java14安装及配置
  15. FPGA时钟篇(二) 7系列clock region详解
  16. android 反编译 .smali,Android_反编译_smali语法
  17. cairo填充_Cairo图形指南
  18. python 时间格式datetime、str与date的相互转换
  19. Ext 4 概述(一)
  20. ffmpeg开源工具的使用_使用开源工具玩龙与地下城

热门文章

  1. 汇编3-返回以及优化
  2. UICollectionViewController
  3. 信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离
  4. Proteus仿真错误解决方法:No power supply specified for net 5V in Power Rail Configuration.
  5. python解析xml数据_Python解析XML数据方法
  6. rx文件管理器window_像浏览器一样管理你的文件!
  7. (4)建立一个标准尺寸的平面,并对其进行着色贴图、拉伸一定的厚度
  8. 字符串函数-STUFF函数
  9. list stream 去重_LeetCode 0349 两个数组的交集, stream()的用法总结
  10. python安装request失败_在python 虚拟环境下使用命令pip install -r request 安装软件失败?...