基本上,我的情况是一个线程抛出了一个异常,而另一个线程需要处理它。我试图使用boost exception来实现这个功能,但在某个地方异常失去了它的类型,因此未被catch块捕获。
基本上,线程B想要做一些事情,但由于各种原因,必须使用线程A(如果您想知道这些原因,请问MS为什么直接3d 9设备必须由创建窗口的同一线程创建、重置和释放)。如果在执行这些操作时发生异常,线程A会捕获它,将其传递回线程B,然后重新抛出以根据需要进行处理。问题是在线程B中抛出的异常似乎与在线程A中抛出的异常不同。:(
下面是我的程序的调试输出和代码。
0x776b42eb处第一次异常:fllib::exception::Error在内存位置0x0019e590处。 0x776b42eb处第一次异常:[rethrow]在内存位置0x00000000处。 0x776b42eb处第一次异常:boost::exception_detail::clone_impl<boost::unknown_exception>在内存位置0x0019eed4处。
//thread B
...
try
{
SendCallback(hwnd, boost::bind(&Graphics::create, this));
}
catch(fllib::exception::Error &except)//example catch block, doesnt catch example exception
{
...handle exception...
}
void SendCallback(HWND hwnd, boost::function<void()> call)
{
boost::exception_ptr *except_ptr =
(boost::exception_ptr*)SendMessage(hwnd, WM_CALLBACK, (unsigned)&call, SEND);
if(except_ptr)//if an exception occurred, throw it in thread B's context
{
boost::exception_ptr except = *except_ptr;
delete except_ptr;
boost::rethrow_exception(except);
}
}
//thread A
LRESULT CALLBACK HookProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
//check for our custom message
if(msg == WM_CALLBACK)
{
if(lParam == POST)
{
...
}
else
{
boost::function<void()> *call = (boost::function<void()>*)wParam;
try
{
(*call)();
}
catch(...)
{
return (unsigned)new boost::exception_ptr(boost::current_exception());
}
return 0;
}
}
else
{
...
}
}
void Graphics::create()
{
...code that may throw exceptions...
eg
throw fllib::exception::Error(L"Test Exception...");
}