首页 > 编程语言 >C#捕获未处理异常

C#捕获未处理异常

时间:2022-08-28 16:24:23浏览次数:41  
标签: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
From: https://www.cnblogs.com/kekec/p/16632813.html

相关文章

  • MathProblem 52 Two children problem
    Awomanischosenatrandomamongallwomenthathavetwochildren.Sheisaskeddoyouhaveatleastoneboy,andsheanswers'yes.'Whatistheprobabilityh......
  • AtCoder Beginner Contest 266 题解
    只有ABCDEFG的题解。A模拟。代码voidmian(){strings;cin>>s;intpos=int(s.size())/2;cout<<s[pos]<<endl;}B模拟,注意longlong。......
  • LeetCode 2186. Minimum Number of Steps to Make Two Strings Anagram II
    原题链接在这里:https://leetcode.com/problems/minimum-number-of-steps-to-make-two-strings-anagram-ii/题目:Youaregiventwostrings s and t.Inonestep,you......
  • PyTorch Geometric(pyg)学习
    参考2个链接: 第十六课.Pytorch-geometric入门(一)_tzc_fly的博客-CSDN博客_pytorch-geometric 第十七课.Pytorch-geometric入门(二)_tzc_fly的博客-CSDN博客......
  • 仅Intel电脑可用:设计2D/3D文档绘图Autodesk AutoCAD 2021
    AutodeskAutoCAD2021是Mac上的二维和三维CAD设计软件,用于产品衍生式设计,创建设计方案,三维模型参数化,建模部件组织,创建制作清晰工程图,设计自动化配置等,AutoCAD2021增强......
  • VS Code出现“由于找不到ffmpeg.dll,无法继续执行代码”的系统错误
    参考此贴:VSCode出现“由于找不到ffmpeg.dll,无法继续执行代码”的系统错误_红豆泥心累的博客-CSDN博客_由于找不到ffmpeg.dll,无法继续执行代码我也遇到了,win11之前都没......
  • 【C++-笔记】override与final说明符
    在effectiveC++中提到C++没有Java那样的finalclasses的禁止派生的机制,遂想到在C++Primer中好像提到过final说明符,正好就连带着override说明符一起复习一下了。简介首......
  • Local范围解析
    当在对象上调用“randomize()with”方法时,Local指的是调用本地的类属性和变量。如果在类中和调用randomize()的范围内都声明了一个变量,则需要区分两者,如下例所示:class......
  • C++ 用函数打印员工的平均工资
    #include<iostream>#include<windows.h>#include<string>usingnamespacestd;floataverageSalary(intn[],inti){floatsum=0;for(intx=0;x......
  • CFA - 金融工程 - 10.利率互换IRS
    背景知识利率互换IRSvs远期合约   一、利率互换合约的机制1.1利率互换以及基准利率  1.2利率互换的应用利用互换,改变负债的特征  利用互换,改......