zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    sql左外连接、右外连接、group by、distinct(区别)、intersect(交叉)、通配符、having
    nvarchar,varchar 区别
    链家笔试链家——找寻最小消费获取最大平均分java
    利用SpringAOP 实现 日志输出
    AOP 学习笔记
    Spring AOP中pointcut expression表达式解析
    基于@Aspect的AOP配置
    URI 中特殊字符处理
    给电脑设置视力保护色
    Spring不支持依赖注入static静态变量
  • 原文地址:https://www.cnblogs.com/wwwzzg168/p/3570083.html
Copyright © 2011-2022 走看看