Win32线程意外退出

时间:2010-05-09 10:42:08

标签: c++ exception winapi multithreading

我正在编写一个C ++应用程序。我意识到我的一个工作线程可能会意外终止。 (VS 2005)调试日志说:

  

线程'Win32 Thread'(0x5d98)有   退出代码为-858993460   (0xcccccccc)。

我用try / catch块包围了所有工作线程代码。所以,如果原因是例外,我会抓住它。但我不能:

try{
   ...
   Connection* conn = connectionPool->getConnection(); // unexpected exit occurs here
   ...
} catch(exception& e) {
   ...
}

我有十个并发运行的线程,其中只有一个在一段时间后崩溃,而其他一个继续运行(并获得新的[OCCI]连接)。

是否存在未被“异常”捕获的异常类型?或者我对线程/异常有什么了解?

感谢。

5 个答案:

答案 0 :(得分:2)

并非所有错误都会引发可以使用C ++ try ... catch机制捕获的C ++异常。例如,除以零不会引发C ++异常,但会导致未定义的行为,这可能会使您的应用程序退出。

但是,您的代码可能会丢弃不是从std :: exception派生的内容,因此您可能需要重写:

try{
   Connection* conn = connectionPool->getConnection(); // unexpected exit occurs here
} 
catch(exception& e) {
    // handle things derived from std::exception
}
catch ( ... ) {
   // handle things that are not so derived
}

将处理throw "eeek!";

之类的内容

此外,但与问题无关,您通常应该通过const引用捕获exceptins。

答案 1 :(得分:1)

找到问题的最简单方法是在调试器下运行应用程序并启用Win32 Exceptions。每当遇到Win32异常时,应用程序都会进入调试器,你可以发现什么是错误的。

如果您没有调试并希望捕获win32结构化异常,则必须使用_set_se_translator api来设置转换器函数。只要存在Win32异常,就会调用已注册的函数,并且您有机会将其转换为您选择的C ++异常。

答案 2 :(得分:1)

  

是否存在未被“异常”捕获的异常类型?

是的,SEH例外。要抓住它们,您需要使用__try / __except MSVC扩展程序(请参阅Structured Exception Handling),或编写全局SEH / VEH处理程序(请参阅SetUnhandledExceptionFilter和{{3} })。

答案 3 :(得分:1)

catch(exception& e)捕获从std::exception派生的C ++异常,而不是其他内容。

它没有捕获从该类派生的 not 的C ++异常(如果我throw 42,它将不会被捕获,例如)并且它没有捕获系统级别的异常或错误。

Windows使用结构化异常处理(SEH)来发出错误信号,并且这些错误不会被普通的C ++ catch语句捕获。这可能包括除以零之类的错误,以及访问冲突或几乎可能在操作系统或硬件级别出错的任何其他错误。

The docs对如何捕获SEH异常有一个很好的解释。

答案 4 :(得分:0)

我发现了一条重要的线索。当您使用CloseHandle函数关闭句柄时,线程将以代码0xCCCCCCCC退出。在这条线索的帮助下,我意识到在非常罕见的情况下,即使线程工作,我也会关闭线程的句柄。为什么在获得连接时它会完全退出?这也有一个解释,但它与代码的结构有关,这可能很难解释。

谢谢大家,在例外问题上与我集思广益:$。