ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#捕获未处理异常

2022-08-28 16:35:18  阅读:178  来源: 互联网

标签:C# 捕获 System Application 线程 using 异常 void


Console控制台程序

使用AppDomain.CurrentDomain.UnhandledException捕获所有线程的未处理异常

注1:执行完异常捕获的OnUncaughtExceptionHandler回调函数后,进程会立即退出。

using System;

namespace ConsoleApp1
{
    class Program
    { 
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException += OnUncaughtExceptionHandler;

            Test();

            Console.ReadLine();
        }

        private static void OnUncaughtExceptionHandler(object sender, System.UnhandledExceptionEventArgs args)
        {
            if (args != null && args.ExceptionObject != null)
            {
                Exception e = args.ExceptionObject as Exception;
                if (e != null)
                {
                    Console.WriteLine("Message: {0}", e.Message);
                    Console.WriteLine("StackTrace: {0}", e.StackTrace);
                }
            }
        }
    }
}

 

捕获主线程的未处理异常

using System;

namespace ConsoleApp1
{
    class Program
    { 
        static void Test()
        {
int a = 12; int b = 0; int c = a / b; // 整数除零异常 System.DivideByZeroException } } }

 

捕获其他线程的未处理异常

using System;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    { 
        static void Test()
        {
            // 创建一个线程并启动执行
            Thread TestThread = new Thread(() =>
            {
                throw new Exception();
            });
            TestThread.Start();
        }
    }
}

 

WindowsForm窗体程序

使用AppDomain.CurrentDomain.UnhandledException捕获所有线程(UI线程和其他线程)的未处理异常

① 需要将Application的UnhandledExceptionMode设置为UnhandledExceptionMode.ThrowException(或UnhandledExceptionMode.Automatic)。

② 执行完异常捕获的OnUncaughtExceptionHandler回调函数后,进程会立即退出。

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false); 
            AppDomain.CurrentDomain.UnhandledException += OnUncaughtExceptionHandler;
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
            Application.Run(new Form1());
        }

        private static void OnUncaughtExceptionHandler(object sender, System.UnhandledExceptionEventArgs args)
        {
            if (args != null && args.ExceptionObject != null)
            {
                Exception e = args.ExceptionObject as Exception;
                if (e != null)
                {
                    MessageBox.Show(string.Format("Message:{0}\nStackTrace:{1}", e.Message, e.StackTrace), "Uncaught Exception");
                }
            }
        }
    }
}

 

捕获UI线程的未处理异常

WindowsForm程序中UI线程即主线程,该线程中处理窗体中各种UI的消息。

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int a = 12;
            int b = 0;
            int c = a / b;  // 整数除零异常  System.DivideByZeroException
        }

    }
}

 

 

捕获其他线程的未处理异常

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
// 创建一个线程并启动执行 System.Threading.Thread TestThread = new System.Threading.Thread(() => { throw new Exception(); }); TestThread.Start(); } } }

 

使用Application.ThreadException捕获UI线程(主线程)的未处理异常

① Application.ThreadException仅能用于UI线程(主线程)的未处理异常捕获,无法捕获其他线程

② 需要将Application的UnhandledExceptionMode设置为UnhandledExceptionMode.CatchException。

③ UnhandledExceptionMode设置为UnhandledExceptionMode.CatchException后,即使绑定了AppDomain.CurrentDomain.UnhandledException全局捕获,UI线程(主线程)仍然只会被Application.ThreadException捕获

④ 执行完异常捕获的ApplicationThreadException回调函数后,进程不会退出,仍可继续运行。

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ApplicationThreadException);
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            Application.Run(new Form1());
        }

        static void ApplicationThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            MessageBox.Show(string.Format("Message:{0}\nStackTrace:{1}", e.Exception.Message, e.Exception.StackTrace), "Application Thread Exception");
        }

    }
}

 

标签:C#,捕获,System,Application,线程,using,异常,void
来源: https://www.cnblogs.com/kekec/p/16632813.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有