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

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.hqwc.cn/news/314205.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++继承与派生——(8)多继承

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 苦难和幸福一样&#xff0c;都是生命盛…

Java API 操作Docker浅谈

背景&#xff1a; 使用com.github.docker-java库可以很方便地在Java中操作Docker。下面是一个详细的教程&#xff0c;包括创建镜像、创建容器、启动容器、停止容器和删除容器的步骤以及每一步的说明。 前提&#xff1a; 首先&#xff0c;在你的Java项目中添加com.github.doc…

gRPC之内置Trace

1、内置Trace grpc内置了客户端和服务端的请求追踪&#xff0c;基于golang.org/x/net/trace包实现&#xff0c;默认是开启状态&#xff0c;可以查看事 件和请求日志&#xff0c;对于基本的请求状态查看调试也是很有帮助的&#xff0c;客户端与服务端基本一致&#xff0c;这里…

c++写入数据到文件中

假设你想编写一个C程序&#xff1a;当你在调试控制台输入一些数据时&#xff0c;系统会自动存入到指定的文件中&#xff0c;该如何操作呢&#xff1f; 具体操作代码如下&#xff1a; #include<iostream> #include<string> #include<fstream> using namespa…

服务器硬件及RAID配置实战

目录 1、RAID的概念 2、RAID的实现方式 3、标准的RAID 3.1 RAID 0 3.2 RAID 1 3.3 RAID 5 3.4 RAID 10 4、建立硬件 RAID的过程步骤 1、进入RAID 1.1 重启服务器 1.2 进入RAID界面 1.3 在RAID界面切换目录 2、创建RAID 2.1 移动到RAID卡 2.2 按F2&#xff0c;选择…

AspectJWeaver之Gadget分析

前言&#xff1a; 今天看了下ysoserial的AspectJWeaver方法&#xff0c;分析了下其是如何通过调用SimpleCache$StorableCachingMap来实现写文件&#xff0c;这里把分析的流程写下来&#xff1a; 首先我们要看下其所需要的jar包&#xff1a; <dependencies><dependen…

redis 从0到1完整学习 (十二):RedisObject 之 List 类型

文章目录 1. 引言2. redis 源码下载3. redisObject 管理 List 类型的数据结构3.1 redisObject 管理 List 类型3.2 List PUSH 源码 4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1…

SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因 1&#xff09;索引失效 索引分为单索、复合索引。 四种创建索引方式 create index index_name on user (name); create index index_name_2 on user(id,name,email); 2&#xff09;查询语句较烂 3&#xff09;关联查询太多join&a…

边缘计算网关在温室大棚智能控制系统应用,开启农业新篇章

项目需求 ●目前大棚主要通过人为手动控温度、控水、控光照、控风&#xff0c;希望通过物联网技术在保障产量的前提下&#xff0c;提高作业效率&#xff0c;降低大棚总和管理成本。 ●释放部分劳动力&#xff0c;让农户有精力管理更多大棚&#xff0c;进而增加农户收入。 ●…

WEB 3D技术 three.js通过光线投射 完成几何体与外界的事件交互

本文 我们来说 光线投射 光线投射技术是用于3维空间场景中的交互事件 我们先编写代码如下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";const scene new THRE…

使用 extract + TextMapAdapter 实现了自定义 traceId

前言 某些特定的场景&#xff0c;需要我们通过代码的方式实现自定义 traceId。 实现思路&#xff1a;通过 tracer.extract 能够构造出 SpanContext &#xff0c;将构造出来的 SpanContext 作为上层节点信息&#xff0c;通过 asChildOf(SpanContext) 能够构造出当前的 span。 …

MVC下的四种验证编程方式

ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表&#xff0c;但是在真正执行目标Action方法之前&#xff0c;还需要对绑定的参数实施验证以确保其有效性&#xff0c;我们将针对参数的验证成为Model绑定。总地来说&#xff0c;我们可以采用4种不同的编程模式来进行针…