C#程序異常關(guān)閉時的捕獲
本文主要以一個簡單的小例子,描述C# Winform程序異常關(guān)閉時,如何進行捕獲,并記錄日志。
概述
有時在界面的事件中,明明有try... catch 進行捕獲異常,但是還是會有異常關(guān)閉的情況,所以在程序中如何最終的記錄一些無法捕獲的異常,會大大方便問題的定位分析及程序優(yōu)化。
涉及知識點
以下兩個異常事件,主要應(yīng)用不同的場景。
- Application.ThreadException 在發(fā)生應(yīng)用程序UI主線程中未捕獲線程異常時發(fā)生,觸發(fā)的事件。
- AppDomain.CurrentDomain.UnhandledException 當后臺線程中某個異常未被捕獲時觸發(fā)。
源代碼
主要程序(Program):
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DemoException
{
static class Program
{
/// <summary>
/// 應(yīng)用程序的主入口點。
/// </summary>
[STAThread]
static void Main()
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
//處理UI線程異常
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
//處理非線程異常
AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException) ;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmMain());
glExitApp = true;//標志應(yīng)用程序可以退出
}
/// <summary>
/// 是否退出應(yīng)用程序
/// </summary>
static bool glExitApp = false;
/// <summary>
/// 處理未捕獲異常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
SaveLog("-----------------------begin--------------------------");
SaveLog("CurrentDomain_UnhandledException"+DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
SaveLog("IsTerminating : " + e.IsTerminating.ToString());
SaveLog(e.ExceptionObject.ToString());
SaveLog("-----------------------end----------------------------");
while (true)
{//循環(huán)處理,否則應(yīng)用程序?qū)顺?
if (glExitApp)
{//標志應(yīng)用程序可以退出,否則程序退出后,進程仍然在運行
SaveLog("ExitApp");
return;
}
System.Threading.Thread.Sleep(2 * 1000);
};
}
/// <summary>
/// 處理UI主線程異常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
SaveLog("-----------------------begin--------------------------");
SaveLog("Application_ThreadException:" + e.Exception.Message);
SaveLog(e.Exception.StackTrace);
SaveLog("-----------------------end----------------------------");
}
public static void SaveLog(string log)
{
string filePath =AppDomain.CurrentDomain.BaseDirectory+ @"\objPerson.txt";
//采用using關(guān)鍵字,會自動釋放
using (FileStream fs = new FileStream(filePath, FileMode.Append))
{
using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
{
sw.WriteLine(log);
}
}
}
}
}
出錯的程序:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DemoException
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
private void FrmMain_Load(object sender, EventArgs e)
{
}
private void btnTestUI_Click(object sender, EventArgs e)
{
int a = 0;
int c = 10 / a;
}
private void btnTest2_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(() =>
{
int a = 0;
int c = 10 / a;
}));
t.IsBackground = true;
t.Start();
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實現(xiàn)Windows服務(wù)測試與調(diào)試
這篇文章介紹了C#實現(xiàn)Windows服務(wù)測試與調(diào)試的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
c# 如何將RadioButton與DataTable數(shù)據(jù)進行綁定
我接觸到的有將兩個控件的數(shù)據(jù)綁定、將控件的屬性與DataTable綁定,以下說說在將DataTable與RadioButton綁定的過程中出現(xiàn)的問題2012-11-11
C#根據(jù)前臺傳入實體名稱實現(xiàn)動態(tài)查詢數(shù)據(jù)
這篇文章主要為大家詳細介紹了C#如何根據(jù)前臺傳入實體名稱實現(xiàn)動態(tài)查詢數(shù)據(jù)的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-04-04

