winform或者wpf項目中難免會遇到忘記捕獲的異常的代碼塊,c#為我們提供了全局捕獲異常的機制 winform中在Program.cs中這樣寫 static class Program { [STAThread] static void Main() { Application.SetUnhan ...
winform或者wpf項目中難免會遇到忘記捕獲的異常的代碼塊,c#為我們提供了全局捕獲異常的機制
winform中在Program.cs中這樣寫
static class Program {
[STAThread] static void Main() {
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //UI線程異常 Application.ThreadException += Application_ThreadException; //非UI線程異常 AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormMain());
} private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { //Log.Error or MessageBox.Show } private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { //Log.Error or MessageBox.Show } }
wpf中在App.xaml.cs這樣寫
public partial class App : Application { public App() { //UI線程異常 this.DispatcherUnhandledException += App_DispatcherUnhandledException; //非UI線程異常 AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; } private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { //Log.Error or MessageBox.Show } private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { //Log.Error or MessageBox.Show } }
我們可以在異常回調裡面彈窗提示或者記錄日誌
這樣寫可以捕獲大部分異常信息,但是有些應用場景例外
比如我們使用[DllImport("xxx.dll")]調用c\c++寫的方法時,無法捕獲異常導致程式卡死或者閃退
我們可以嘗試用[HandleProcessCorruptedStateExceptions]特性
[HandleProcessCorruptedStateExceptions] public void DoSomething() { try { Test(1, 2); } catch(Exception ex) { //Log or MessageBox.Show } } [DllImport("xxx.dll")] public static extern int Test(int a,int b);