C# WinForm捕获全局异常

C# WinForm捕获全局异常

  许多小公司的项目都缺少异常处理模块,我们也是。经常会出现这种情况,用户在UI界面操作,就直接跳出堆栈调用的异常信息对话框,老板看到那叫一个火啊!你们的代码怎么天天出现乱码。呵呵!这就是没有异常捕获处理导致的,现在许多人写代码都没意识处理异常,只要实现功能就好,我的许多组员也是如此。

  项目刚接手,所以打算做一个异常全局捕获,统一处理的模式,采用具体详细信息的对话框提醒与日志文件保存方式。以下是根据网上找的C#winform全局异常捕获做了点修改。 

static class Program
     {
         /// <summary>
         /// 应用程序的主入口点。
         /// </summary>
         [STAThread]
         static void Main()
         {
             try
             {
                 //设置应用程序处理异常方式:ThreadException处理
                 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                 //处理UI线程异常
                 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                 //处理非UI线程异常
                 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
 
                 #region 应用程序的主入口点
                 Application.EnableVisualStyles();
                 Application.SetCompatibleTextRenderingDefault(false);
                 Application.Run(new Form1());
                 #endregion
             }
             catch (Exception ex)
             {
                 string str = GetExceptionMsg(ex,string.Empty);
                 MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
         }
 
 
         static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
         {
             string str = GetExceptionMsg(e.Exception, e.ToString());
             MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
             //LogManager.WriteLog(str);
         }
 
         static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
         {
             string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
             MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
             //LogManager.WriteLog(str);
         }
 
         /// <summary>
         /// 生成自定义异常消息
         /// </summary>
         /// <param name="ex">异常对象</param>
         /// <param name="backStr">备用异常消息:当ex为null时有效</param>
         /// <returns>异常字符串文本</returns>
         static string GetExceptionMsg(Exception ex,string backStr)
         {
             StringBuilder sb = new StringBuilder();
             sb.AppendLine("****************************异常文本****************************");
             sb.AppendLine("【出现时间】:" + DateTime.Now.ToString());
             if (ex != null)
             {               
                 sb.AppendLine("【异常类型】:" + ex.GetType().Name);
                 sb.AppendLine("【异常信息】:" + ex.Message);
                 sb.AppendLine("【堆栈调用】:" + ex.StackTrace);
             }
             else
             {
                 sb.AppendLine("【未处理异常】:" + backStr);
             }
             sb.AppendLine("***************************************************************");
             return sb.ToString();
         }
     }

-----------------
配合用log4.net做日志记录

下面这段配置放在app.config里,放在<configuration>下即可

------config begin-------
  <configSections>
    <section name="log4net"  type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <log4net debug="true">
    <logger name="Admin">
      <!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
      <level value="DEBUG" />
      <appender-ref ref="rollingFile" />
    </logger>
    <appender  name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" type=""  value="Logs\\" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="10"/>
      <param name="RollingStyle" value="Date" />
      <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d  %5p: %m%n" />
      </layout>
    </appender>
  </log4net>

--- config end---

log.cs 类文件,放在一个公用的地方,即可

程序里要记录的地方直接用
ShareLibrary.Log.Debug(str);
或者
ShareLibrary.Log.Debug(ex);

---------- cs begin-----------

using System;
using System.Collections.Generic;
using System.Text;
using log4net;

namespace ShareLibrary
{
    public class Log
    {
       
        private static log4net.ILog log = log4net.LogManager.GetLogger("Admin");
        public static void Debug(string message)
        {
            if (log.IsDebugEnabled)
            {
                log.Debug(message);
            }
        }
        /// <summary>
        /// 记录异常的相关信息,log4net
        /// </summary>
        /// <param name="ex1"></param>
        public static void Debug(System.Exception ex1)
        {
            if (!log.IsDebugEnabled)
            {
                //若不可用,重新配置
                log4net.Config.XmlConfigurator.Configure();
            }
            log.Debug(ex1.Message.ToString() + "\r\n" + ex1.Source.ToString() + "\r\n" + ex1.TargetSite.ToString() + "\r\n" + ex1.StackTrace.ToString());
            //if (log.IsDebugEnabled)
            //{

               
            //    log.Debug(ex1.Message.ToString() + "\r\n" + ex1.Source.ToString() + "\r\n" + ex1.TargetSite.ToString() + "\r\n" + ex1.StackTrace.ToString());
            //}
           
        }
        public static void Error(string message)
        {
            if (log.IsErrorEnabled)
            {
                log.Error(message);
            }
        }
        public static void Fatal(string message)
        {

            if (log.IsFatalEnabled)
            {
                log.Fatal(message);
            }
        }
        public static void Info(string message)
        {
            if (log.IsInfoEnabled)
            {
                log.Info(message);
            }
        }

        public static void Warn(string message)
        {
            if (log.IsWarnEnabled)
            {
                log.Warn(message);
            }
        }
    }
}

----------- cs 结束---------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值