• .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)
                {
                    
    if (exception != null)
                    {
                        exception(ex);
                    }
                }
            }
        }

    上面使用委托的方式,间接的解决了:把子线程中的异常信息交个主线程的一个方法去执行。(通过委托方式)

    Best Reagrds,

    Charles Chen

  • 相关阅读:
    npm查找全局安装包命令
    sublime3添加对react代码检查
    Android开发——搭建最新版本的Android开发环境
    git无法定位程序输入点libiconv
    Java学习----finally块
    Java学习----有风险的代码(异常)
    Java学习----集合函数
    Java学习----Math函数
    Java学习----日期函数
    Java学习----字符串函数
  • 原文地址:https://www.cnblogs.com/wwwzzg168/p/3570083.html
Copyright © 2020-2023  润新知