C#捕获未处理异常
2022/8/29 1:22:57
本文主要是介绍C#捕获未处理异常,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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#捕获未处理异常的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具