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".log"" />
<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 结束---------------