关闭

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

标签: log4net.net
826人阅读 评论(0) 收藏 举报
分类:


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

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

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

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

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

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


image


需要在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文件中添加异常捕获的代码即可。


image


完整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文件中添加异常捕获的代码即可

image

在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);
        }
   
    }
}

0
0
查看评论

log4net的全局异常的配置

1、首先使用nuget,为项目添加log4net 2、配置log4net (1)App_Start文件目录下,新增Log4netRegister.cs文件: public class Log4netRegister { public static void Regi...
  • yuewei19
  • yuewei19
  • 2016-08-09 18:11
  • 777

WinForm、ASP.NET、MVC记录全局错误日志

之前我转载了一篇“C#使用Log4Net记录日志”,但如果是错误日志,则没必要在每个方法里面捕获异常再记录日志,这时我们写一个全局的错误日志记录方法就行了,但这全局到底应该写在哪呢? 不同的项目写的地方是不一样的:WinForm、ASP.NET、MVC WinForm:在Program.cs文件...
  • dongliang_shali
  • dongliang_shali
  • 2016-02-24 14:28
  • 3183

C# winform使用log4net步骤

1.使用工程中引入log4net的dll2.主工程的app.config中增加log4net配置<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe...
  • letmefish
  • letmefish
  • 2016-07-19 19:07
  • 2572

C#Winform 下使用log4net成功的例子

  • 2011-07-09 15:25
  • 122KB
  • 下载

Log4net日志功能-记录数据库异常和系统异常

  • 2009-11-30 14:29
  • 274KB
  • 下载

log4net-错误日志抛出

之前在这篇博客中已经介绍过两种抛出错误日志的方法了,这次在分享一个log4net错误日志抛出法,这个与之前不同的是,这个不需要调用可以自动捕捉错误,相对的多做的一点就是要提前配置好log4net并添加该引用 简介 LogNet是用来记录日志的,可以将程序运行过程中的信息输出到一些地方,日志就是程...
  • Ljm15832631631
  • Ljm15832631631
  • 2016-12-19 10:14
  • 419

c# winform捕获全局异常,并记录日志

using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.IO; namespace OrderSplit { static cla...
  • bruce135lee
  • bruce135lee
  • 2017-11-16 15:00
  • 136

C# WinForm捕获全局异常(捕获未处理的异常)

原文地址:http://www.cnblogs.com/wangshenhe/archive/2012/11/14/2769605.html 许多小公司的项目都缺少异常处理模块,我们也是。经常会出现这种情况,用户在UI界面操作,就直接跳出堆栈调用的异常信息对话框,老板看到那叫一个火啊!你们...
  • mar_ljh
  • mar_ljh
  • 2015-05-05 17:27
  • 4935

Winform 主程序入口中记录并捕获全局异常

在做一些应用中,根据实际的需求情况,网上也收了些资料。这个对查找程序中的bug及出现的一些问题能很好排查,找到问题原因!
  • sunchanglong
  • sunchanglong
  • 2015-12-22 21:47
  • 885

捕捉C#全局异常的事件处理

对于初学者,C#应用程序可能会遇到一些导致软件宕机的似是而非的异常。有的异常普通处理不太好分析,这里就需要用到全局异常捕捉。下面是以输出的形式来查看异常,也可以通过log4net输出到文件中查看分析。        [STAThrea...
  • Liu_Yong_
  • Liu_Yong_
  • 2016-07-22 15:39
  • 2257
    个人资料
    • 访问:3596次
    • 积分:44
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档