在我的代码的发布版本中,一行引发异常,我不知道它是什么类型的异常,所以我无法正确捕获它或找出问题。
我使用了catch(...),但这几乎毫无价值。
这里有一些伪代码
try
{
m_mmwIPC = gcnew NiftyIPC(gcnew String("Monitor"), true);
}
catch (CException* e)
{
TCHAR szCause[255];
e->GetErrorMessage(szCause, 255);
CString errorStr = szCause;
RemoveLineFeeds(errorStr);
OutputDebugString(errorStr);
}
catch(...)
{
OutputDebugString(L"Unknown exception\n");
}
那么,有没有办法获得有关抛出的未知异常的任何细节?只是一种类型会很棒。
感谢
答案 0 :(得分:6)
不是,它可能是int
,const char*
或RhubarbPie
超智能指针。
然而:
std::exception
。这将捕获许多C ++本机异常。答案 1 :(得分:1)
当您指定使用MFC时,我将假设您使用的是Visual Studio版本。如果是这种情况并且您能够以调试模式运行程序,则可以将调试器设置为中断未处理的异常。这需要删除代码的catch(...)
部分,但它应该在正确的位置进入调试器,并为您提供有关异常本身的有用信息。
答案 2 :(得分:1)
每个异常都应来自std::exception
,然后您可以使用RTTI。标准捕获块是
catch (const std :: exception & e) {
// e .what ();
// typeid (e);
}
catch (...) {
// WTF ?!?!?
}
在c ++ 0x中,你可以使用std::current_exception
并将exception_ptr
传递给一些聪明的库进行分析。
请记住,异常可以是buildins和其他没有RTTI的类型,这就是为什么你应该总是从std :: exception派生出来。
答案 3 :(得分:0)
不,这不是。 catch(...)应该只作为最后的手段使用。
答案 4 :(得分:0)
一个选项是不捕获错误并在调试器中运行程序员(这在发布模式下是可能的)。 Visual Studio将进入未捕获异常发生的代码。