#include <iostream>
#include <windows.h>
DWORD WINAPI thread_func(LPVOID pN)
{
for (int i = 0; i < *((int*)pN); ++i) {
std::cout << i+1 << "\t";
}
std::cout << std::endl;
throw "ok.";
std::cout << "thread_func() done." << std::endl;
return 0;
}
int main(int argc, char* argv[])
{
int n = 5;
try{
thread_func((LPVOID)&n);
Sleep(2000);
}
catch (const char* s) {
std::cerr << s << std::endl;
exit(1);
}
std::cout << "main() done." << std::endl;
return 0;
}
可以看到Q函数thread_func()可以正确的抛出异常ƈ被main()的catch捕捉。但是,如果用一个新U程来运行thread_func()会出C么情况呢Q?br>
#include <iostream>
#include <windows.h>
DWORD WINAPI thread_func(LPVOID pN)
{
for (int i = 0; i < *((int*)pN); ++i) {
std::cout << i+1 << "\t";
}
std::cout << std::endl;
throw "ok.";
std::cout << "thread_func() done." << std::endl;
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hThrd;
DWORD thrdId;
int n = 5;
try{
hThrd = CreateThread( NULL,
0,
thread_func,
(LPVOID)&n,
0,
&thrdId);
Sleep(2000);
}
catch (const char* s) {
std::cerr << s << std::endl;
exit(1);
}
std::cout << "main() done." << std::endl;
return 0;
}
很不q,q个E序~译的时候是可以通过的,但是q行时出错:
1 2 3 4 5
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
hL键l? . .
而且同时会有一个运行时错误的提C。事实上Q这个错误提C意味着E序在没有发现try{}的时候看Cthrow?br>通过试验Q我发现pȝQ这里是win32Q不能将CreateThread()所产生的线E归l到try{}中。更加严重的情况是,即用一个函数囊括了整个E序Q然后tryq个函数Q其他线E依然脱Mq个try?br>所以,一个解x法是Q凡是遇到新的线E,必须在新U程中重新写异常处理。不Ӟ如google代码标准里所说的那样Q不使用C++的异常机制。毕竟C++没有定义多线E的标准Q所以也无从说起多U程中异常处理的标准?br>最后附上在新线E写异常处理的参考:
#include <iostream>
#include <windows.h>
DWORD WINAPI thread_func(LPVOID pN)
{
try{
for (int i = 0; i < *((int*)pN); ++i) {
std::cout << i+1 << "\t";
}
std::cout << std::endl;
throw "ok.";
}
catch (const char* s) {
std::cerr << s << std::endl;
exit(1);
}
std::cout << "thread_func() done." << std::endl;
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hThrd;
DWORD thrdId;
int n = 5;
hThrd = CreateThread( NULL,
0,
thread_func,
(LPVOID)&n,
0,
&thrdId);
Sleep(2000);
std::cout << "main() done." << std::endl;
return 0;
}

]]>