c# 捕获全部线程的异常 试验

news2024/11/25 6:54:58

1.概要 捕获全部线程的异常 试验,最终结果task的异常没有找到捕获方法

2.代码

2.1.试验1

2.1.1 试验结果

 2.2 代码

2.2.1主程序代码

using NLog;
using System;
using System.Threading;
using System.Windows.Forms;

namespace 异常监控
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            try
            {
                Logger Logger = LogManager.GetCurrentClassLogger();
                //设置应用程序处理异常方式:ThreadException处理
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                //处理UI线程异常
                Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                //处理非UI线程异常
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            catch(Exception ex)
            {
                ToolInfo.WriteRecord("SystemLog", "Main", ex.ToString());
            }
                
        }
        /// <summary>
        /// UI异常处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            ToolInfo.WriteRecord("SystemLog", "Main1", e.Exception.ToString());
        }

        /// <summary>
        /// 非UI异常处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            ToolInfo.WriteRecord("SystemLog", "Main2", e.ExceptionObject.ToString());
        }
    }
}

 2.2.2窗口代码

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 异常监控
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            throw new Exception("dddd");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Task task = new Task(() =>
            {
                throw new Exception("dddd");
            });
            task.Start();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(() => {

                throw new Exception("dddd");
            });
            thread.Start();
        }
    }
}

2.2.3日志类 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 异常监控
{
    /// <summary>
    /// 通用方法工具类
    /// </summary>
    public static class ToolInfo
    {
       
        /// <summary>
        /// 文档记录
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <param name="filename">文件名称</param>
        /// <param name="str">内容</param>
        public static void WriteRecord(string path, string filename, string str)
        {
            DateTime nowTime = DateTime.Now;
            int nYear = nowTime.Year;
            int nMonth = nowTime.Month;
            int nDay = nowTime.Day;
            int nHour = nowTime.Hour;

            //创建记录文件名称
            string strDT = "";
            string strfilename = "";
            strDT = nowTime.Day.ToString() + nowTime.Hour.ToString();
            strfilename = string.Format(".\\{0}\\{1}-{2}.txt", path, filename, strDT);

            //删除文件名称
            for (int i = 1; i < nDay; i++)
            {
                for (int j = 1; j <= 24; j++)
                {
                    string strLYDT = "";
                    string strLYfilename = "";
                    strLYDT = i.ToString() + j.ToString();
                    strLYfilename = string.Format(".\\{0}\\{1}-{2}.txt", path, filename, strLYDT);
                    //删除今天之前的文件

                    if (File.Exists(strLYfilename))
                    {
                        File.Delete(strLYfilename);
                    }
                }
            }
            //记录内容
            string strData = "";
            strData = nowTime.ToString();
            strData += ": ";
            strData += str;
            strData += "\r\n";

            FileStream fs = new FileStream(strfilename, FileMode.Append);

            StreamWriter sw = new StreamWriter(fs);
            sw.Write(strData);
            sw.Flush();
            sw.Close();
            fs.Close();
        }
       
    }
}

2.2 试验2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

            try
            {
                throw new Exception("1");
            }
            catch (Exception e)
            {
                Console.WriteLine("Catch clause caught : {0} \n", e.Message);
            }
            Task t = new Task(() =>
            {
                throw new Exception("2");
            });
            t.Start();
            Console.ReadKey();
            
        }
        static void MyHandler(object sender, UnhandledExceptionEventArgs args)
        {
            Exception e = (Exception)args.ExceptionObject;
            Console.WriteLine("MyHandler caught : " + e.Message);
            Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
        }
    }
}

2.3 试验3 监控主线程的异常

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

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

            // 创建一个新线程并抛出异常
            Thread thread = new Thread(DoSomething);
            thread.Start();

            // 主线程继续执行其他操作
            Console.WriteLine("主线程继续执行其他操作...");

            // 防止主线程退出
            Console.ReadLine();
        }
        static void DoSomething()
        {
            throw new Exception("线程抛出异常");
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Exception ex = (Exception)e.ExceptionObject;
            Console.WriteLine("捕获到异常:" + ex.Message);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1350180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

es简单入门

星光下的赶路人star的个人主页 努力努力再努力 文章目录 1、简介2、使用场景3、基本知识4、中文文档和官网链接5、增删改查&#xff08;php代码&#xff09;6、基本查询7、HTTP操作7.1 索引操作7.1.1 创建索引 7.2 文档操作7.2.1 创建文档7.2.2 查看文档7.2.3 修改文档7.2.4 修…

机器学习(二) -- 数据预处理(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 未完待续…… 目录 系列文章目录 前言 一、概述 二、数据获取 三、数据分布与趋势探查 1、散点图 2、折线图 3、频率分布直…

Weblogic安全漫谈(一)

前言 frohoff在2015年初发现commons-collections的反序列化利用链并发布了ysoserial工具[1]。9个月后&#xff0c;breenmachine对众多知名Java中间件的利用文章[2]使Java反序列化漏洞变得广为人知&#xff0c;Weblogic中首当其冲的就是大家多少都有点耳熟的T3协议反序列化。本…

算法训练营Day34(贪心算法)

1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 秒了 class Solution {public int largestSumAfterKNegations(int[] nums, int k) {Arrays.sort(nums);// -4 -3 -2 -1 5//-2 -2 0 2 5int last -1;for(int i 0;i<…

VS Code 远程连接云机器训练配置

VS Code 远程连接云机器 Visual Studio Code&#xff08;以下简称 VS Code&#xff09;是一个由微软开发的代码编辑器。VS Code 支持代码补全、代码片段、代码重构、Git 版本控制等功能。 安装 VSCode步骤简单且网上有很多教程&#xff0c;这里不过多重复了。 VS Code 现已支…

如何使用批量重命名技巧:将文件名称中文翻译成英文

在日常生活和工作中&#xff0c;经常要处理大量的文件&#xff0c;其中很多文件的名称是中文的。有时&#xff0c;要更好地与国际接轨或是满足特定的需求&#xff0c;要将这些中文文件名称翻译成英文。一个一个手动翻译不仅效率低下&#xff0c;而且容易出错。此时&#xff0c;…

深度学习|10.2 边缘检测示例 10.3 更多边缘检测

文章目录 如何在编程中实现卷积运算使用卷积实现边缘检测结果矩阵的元素正负性质的意义水平分类器如何构造卷积运算使用的矩阵 原矩阵通过一个过滤器&#xff08;filter&#xff09;/核心&#xff08;kernel&#xff09;来生成一个新的矩阵。 如何在编程中实现卷积运算 使用卷积…

如何基于 ESP32-S3 和 ESP32-H2 产品构建 WiFi +Thread 边界路由器?

参考文档&#xff1a; Building the images for ESP Thread Border Router and CLI device and forming a Thread network with the devices 硬件准备&#xff1a; ESP32-S3-DevKitC-1ESP32-H2-DevKitM-1 软件准备&#xff1a; esp-idf/ examples/ openthread/ ot_rcp&#x…

AD教程 (二十二) Class、设计参数、规则的创建

AD教程 (二十二) Class、设计参数、规则的创建 CLASS 对于我们的板子需要去区分电源和信号按N&#xff0c;点击隐藏连接&#xff0c;全部&#xff0c;显示飞线&#xff0c;哪一些线是电源走线&#xff0c;哪一些线是信号传输走线&#xff0c;需要我们进行区分&#xff0c;这就…

MAC电脑安装java开发工具

一、安装brew 1.1、官网地址 链接 1.2、更新地址 二、安装 java brew install openjdk11 三、安装gradle Gradle安装与配置教程 - 知乎 四、GIT 4.1、GIT安装 brew install git 4.2、rsa ssh-keygen -t rsa -C "jhestarbucks.com" 五、自动搭建一个springBoot…

idea中java maven程序打JAR包的方式

JAR包是一种文件格式&#xff0c;用于将Java类、资源和元数据打包到一个文件中。它通常用于将Java库、应用程序或模块分发给其他开发人员或部署到不同的环境中。JAR包可以包含许多不同类型的文件&#xff0c;包括.class文件&#xff08;编译后的Java类&#xff09;、.java文件&…

【计算机毕业设计】SSM电器商城系统

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,销售统计,商品类目管理,用户管理,商品管理,订单管理,公告管理,留言管理等功能。 用户角色包含以下功能&#xff1a; 浏…

OpenCV-Python(22):直方图反向投影

引言 直方图反向投影是一种基于图像颜色分布的图像处理技术&#xff0c;它通过计算图像中不同区域的颜色直方图&#xff0c;并将其与目标区域的直方图进行比较&#xff0c;从而实现目标的识别和分割。本文将介绍直方图反向投影的原理和应用&#xff0c;并探讨其在计算机视觉任务…

服务器被入侵后如何查询连接IP以及防护措施

目前越来越多的服务器被入侵&#xff0c;以及攻击事件频频的发生&#xff0c;像数据被窃取&#xff0c;数据库被篡改&#xff0c;网站被强制跳转到恶意网站上&#xff0c;网站在百度的快照被劫持等等的攻击症状层出不穷&#xff0c;在这些问题中&#xff0c;如何有效、准确地追…

Java学习苦旅(十七)——栈和队列

本篇博客将详细讲解Java中的栈和队列。 文章目录 栈概念Java中Stack常用方法代码实现 队列概念队列常用方法对比QueueDeque 代码实现Queue 结尾 栈 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一…

Codeium在IDEA里的3个坑

转载自Codeium在IDEA里的3个坑&#xff1a;无法log in&#xff0c;downloading language server和中文乱码_downloading codeium language server...-CSDN博客文章浏览阅读1.7w次&#xff0c;点赞26次&#xff0c;收藏47次。Codeium安装IDEA插件的3个常见坑_downloading codeiu…

基于ssm鲜花销售管理系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;项目介绍 随着科学技术的飞速发展…

【Linux常用指令】用户管理

文章目录 Linux系统目录结构Linux用户和用户组用户管理概述用户账号和用户组用户概念用户组概念 Linux用户和组的关系 Linux用户管理添加用户 useradd选项修改用户 usermod用户账号口令管理passwd删除用户 userdel Linux用户组管理添加新组groupadd修改群组groupmod删除群组gro…

2024史上最全的 iOS 各种测试工具集锦!

引言&#xff1a; 随着移动互联网的兴起&#xff0c;APP 测试的越来越被重视&#xff01;Android 系统因为自己的开源性&#xff0c;测试工具和测试方法比较广为流传&#xff0c;但是 iOS 系统的私密性&#xff0c;导致很多测试的执行都有点麻烦。 为了帮助大家更好的执行 iO…

Sectigo和Certum的区别

为了保护用户在互联网的隐私&#xff0c;网站使用SSL数字证书为http明文传输协议加上安全套接层&#xff0c;对网站传输数据加密。Sectigo和Certum是正规的CA认证机构&#xff0c;它们颁发的SSL证书经过市场认证&#xff0c;已经兼容大多数浏览器以及终端&#xff0c;今天就随S…