Windows线程异常捕捉

来源:互联网 发布:ipadpro下载软件流程 编辑:程序博客网 时间:2024/06/05 08:50

参考:http://www.cppblog.com/weiym/archive/2015/02/27/209884.html

参考:http://blog.csdn.net/y84161838/article/details/5777388


在Windows中,__try, __excetpt是在Windows程序中提供的SHE异常处理的机制。在__except的函数参数取值有三类:最常用的是EXCEPTION_EXECUTE_HANDLER (1)

EXCEPTION_CONTINUE_EXECUTION (–1) 异常被忽略,控制流将在异常出现的点之后,继续恢复运行。

EXCEPTION_CONTINUE_SEARCH (0)  异常不被识别,也即当前的这个__except模块不是这个异常错误所对应的正确的异常处理模块。系统将继续到上一层的try-except域中继续查找一个恰当的__except模块。

EXCEPTION_EXECUTE_HANDLER (1)  异常已经被识别,也即当前的这个异常错误,系统已经找到了并能够确认,这个__except模块就是正确的异常处理模块。控制流将进入到__except模块中。

 

对于多线程程序,在主线程做下面异常捕捉,是不能实现子线程的异常捕捉处理的,整个程序会因为线程的异常而崩溃掉。

MainThread

  ChildThread1

  ChildThread2

  ChildThread3

例如:在MainThread做异常处理,当Thread的run函数执行异常时,是捕捉不到的

   __try

    {

        m_pThread1->start();

        m_pThread2->start();

        m_pThread3->start();

    }

    __except(EXCEPTION_EXECUTE_HANDLER) // 1:异常被识别

    {

        promptContent(this);

    }

 

如果要捕捉线程run过程中的异常,需要在Thread的run函数中捕捉异常

void CMyThread::run()

{

    __try

    {

        runContent(m_sThreadName,m_pParent);

    }

    __except(EXCEPTION_EXECUTE_HANDLER)

    {

        promptContent(m_sThreadName,m_pParent);

        quit();

    }

}

 

这样,当线程运行产生异常,就有线程中的异常捕捉方法来捕获异常,处理异常。

程序就不会因为线程崩溃而无法继续执行下去。


 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)


0 0
原创粉丝点击