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

  • 相关阅读:
    zzulioj 2558 数字的差值
    ReSharper 配置及用法(转)
    HttpWebRequest的常见错误使用TcpClient可避免
    windows 2003 64位系统php运行报错:1% 不是有效的 win32 应用程序 .
    C#中使用list Add的问题
    HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的
    调用webservice时提示对操作的回复消息正文进行反序列化时出错&&Web service 超过了最大请求长度
    LINQ与labmda对照表
    Use dynamic type in Entity Framework 4.1 SqlQuery() method
    HttpWebResponse.GetResponse() 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。
  • 原文地址:https://www.cnblogs.com/wwwzzg168/p/3570083.html
Copyright © 2011-2022 走看看