当前位置:编程学习 > C#/ASP.NET >>

.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();
        }
    }

 

为什么呢?

首先需要了解异常的实现机制:异常的实现机制是严重依赖与线程的栈的。每个线程都有一个栈,线程启动后会在栈上安装一些异常处理帧,并形成一个链表的结构,在异常发生时通过该链表可以进行栈回滚,如果你自己没有安装的话,可能会直接跳到链表尾部,那可能是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
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,