在开发中,有一些常常用到的方法,每次查找以前写的比较麻烦 ,自己写有在做重复工作 ,所以总一个小的工具类,随时添加内容
3.winform窗体全程异常捕捉 静态类 FormTools( public static class FormTools)
/// <summary>
/// 异常处理方法
/// </summary>
public static void ExceptionControl()
{
//设置应用程序处理异常方式:ThreadException处理
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
//处理UI线程异常
Application.ThreadException += (sender, e) =>
{
var str = GetExceptionMsg(e.Exception, e.ToString());
var messageForm =new ErrorMessageForm();
messageForm.SetMessage(str);
var flg = FormIsShow(messageForm.Name);
if (flg) return;
messageForm.ShowDialog();
};
//处理非UI线程异常
AppDomain.CurrentDomain.UnhandledException += (sender, e)=>
{
var str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
var messageForm = new ErrorMessageForm();
messageForm.SetMessage(str);
var flg = FormIsShow(messageForm.Name);
if (flg) return;
messageForm.ShowDialog();
};
}
/// <summary>
/// 生成自定义异常消息
/// </summary>
/// <param name="ex">异常对象</param>
/// <param name="backStr">备用异常消息:当ex为null时有效</param>
/// <returns>异常字符串文本</returns>
private static string GetExceptionMsg(Exception ex, string backStr)
{
var sb = new StringBuilder();
if (ex == null)
{
sb.AppendLine("【errmsg】:" + backStr);
}
else
{
if (ex.GetType().Name.ToLower() == "exception")
{
return ex.Message;
}
sb.AppendLine("【msgtime】:" + DateTime.Now);
sb.AppendLine("【msgtype】:" + ex.GetType().Name);
sb.AppendLine("【callstack】:" + ex.Message);
sb.AppendLine("【untreated】:" + ex.StackTrace);
}
return sb.ToString();
}
调用
FormTools.ExceptionControl();
调用截图
注意:
处理方法中有以下代码,是自己写的一个消息提示框
var messageForm =new ErrorMessageForm();
messageForm.SetMessage(str);
var flg = FormIsShow(messageForm.Name);
if (flg) return;
messageForm.ShowDialog();
可以用以下代码替换
MessageBox.Show(str);
如此一来,只要程序产生的错误都可以已提示框的形式展现出来,不会直接崩掉等等。其实我觉着可以利用异常的这种机制来做消息提示和消息展示。然后可以做一个漂亮的消息提示框,可以避免在整个程序中使用提示信息与窗体肤色、风格不同的现象,也可以避免老板“说乱码”。