zoukankan      html  css  js  c++  java
  • WinCE5.0移动平台开发笔记(.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

  • 相关阅读:
    采用C/C++语言如何实现复数抽象数据类型Complex
    单链表的插入伪算法和用C语言创建单链表,并遍历
    SQL多列查询最大值
    修改网页页面显示内容
    成为智者的四个敌人——唐望
    从0到1:构建强大且易用的规则引擎(转)
    身份采集、活体检测、人脸比对...旷视是如何做FaceID的? (转)
    drools -Rete算法(转)
    风控决策引擎系统的搭建设计指南(转载)
    [上市与资本运作] 【干货】创业公司天使轮、A轮、B轮……IPO融资时如何分配股权?(转载)
  • 原文地址:https://www.cnblogs.com/Charles2008/p/1691017.html
Copyright © 2011-2022 走看看