.Net主线程扑捉子线程中的异常
首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常。
代码
class Program
{
static void Main(string[] args)
{
try
{
System.Threading.Thread thread = new System.Threading.Thread(new Program().run);
thread.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Thread.Sleep(1000);
}
public void run()
{
throw new Exception();
}
}
{
static void Main(string[] args)
{
try
{
System.Threading.Thread thread = new System.Threading.Thread(new Program().run);
thread.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Thread.Sleep(1000);
}
public void run()
{
throw new Exception();
}
}
为什么呢?
首先需要了解异常的实现机制:异常的实现机制是严重依赖与线程的栈的。每个线程都有一个栈,线程启动后会在栈上安装一些异常处理帧,并形成一个链表的结构,在异常发生时通过该链表可以进行栈回滚,如果你自己没有安装的话,可能会直接跳到链表尾部,那可能是CRT提供的一个默认处理帧,弹出一个对话框提示某某地址内存错误等,然后确认调试,取消关闭。
所以说,线程之间是不可能发生异常处理的交换关系的。
但是在实际的程序设计中,会牵涉到扑捉子线程的异常,那么该怎样解决这个问题呢?
代码
class Program
{
private delegate void ExceptionHandler(Exception ex);
private static ExceptionHandler exception;
private static void ProcessException(Exception ex)
{
Console.WriteLine(ex.Message);
}
static void Main(string[] args)
{
exception = new ExceptionHandler(ProcessException);
System.Threading.Thread thread = new System.Threading.Thread(new Program().run);
thread.Start();
Thread.Sleep(1000);
}
public void run()
{
try
{
throw new Exception();
}
catch (Exception ex)
&nb
{
private delegate void ExceptionHandler(Exception ex);
private static ExceptionHandler exception;
private static void ProcessException(Exception ex)
{
Console.WriteLine(ex.Message);
}
static void Main(string[] args)
{
exception = new ExceptionHandler(ProcessException);
System.Threading.Thread thread = new System.Threading.Thread(new Program().run);
thread.Start();
Thread.Sleep(1000);
}
public void run()
{
try
{
throw new Exception();
}
catch (Exception ex)
&nb
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,
部分文章来自网络,