我正在使用一个C ++项目(我不是作者),它有很多MFC字符串格式化函数。不幸的是,像%d
和%s
之类的东西非常接近(包括键盘上字母d和s的位置),可以将其与另一个转置。所以我有时会看到一个代码行:
CString s;
s.Format(L"Value v=%s", 100); //Should've been %d instead
这导致该过程的严重崩溃,这是非常难以定位的。在最终项目中孤立。所以我想将Format
函数包装在我自己的覆盖中并捕获异常&在它被抛出为未处理的异常之前记录它。
所以我采用了以下结构:
__try
{
//Do the Format function here
}
__except(1)
{
//Log the error, etc.
}
但遗憾的是上面的构造没有从第一个代码块中捕获异常,所以我得到了VS 2008 C ++调试器启动并显示:
然后我尝试了这个:
try
{
//Do the Format function here
}
catch(int e)
{
//Do the logging
}
但那也没有抓住它。
那我怎么能抓住这个错误呢?
PS。我还有第二个问题。是否有一种简单的方法来覆盖MFC功能,例如Format?
答案 0 :(得分:0)
MFC抛出CException
指针,所以你可以试试这个:
try
{
// Do the Format function here
}
catch(CException* e)
{
// Do the logging then free the exception
if (m_bThrowExceptionAgain)
throw; // Do not delete e
else
e->Delete();
}
一旦捕获了异常对象,就必须删除它,如示例所示。还要确保在编译器中启用了C ++异常。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/0e5twxsh.aspx。
答案 1 :(得分:0)
正如其他人已经说的那样,低级异常(如访问冲突)与C ++异常不同。它们属于Structured Exception Handling一词,并且至少在默认情况下需要其他方法来捕获。
可以更改编译器设置(至少在Visual Studio中)以使它将这些异常包装到C ++ try / catch语句可以处理的内容中,但是我记得它丢失了SEH异常的详细信息以及它在哪里来自。
您可能会以某种方式获得异常,以便有效地帮助追踪这些问题,但还有另一种方法:使用静态代码分析。
虽然标准C ++编译器通常不会验证格式/ printf样式的调用,但会有各种工具。事实上,Visual Studio的一些最新版本/版本附带code analysis tool,尽管在您提及的VS 2008中可能没有。因此,您可能值得进行一些研究,看看是否可以获得某种代码分析工具,然后可以在分析/编译时捕获所有CString :: Format错误而不是运行时。< / p>
答案 2 :(得分:0)
您可以使用_set_se_translator()
将访问冲突等SEH异常转换为C ++异常,然后您可以使用except()
来抓取这些异常。
一些示例代码:http://www.codeproject.com/Articles/422/SEH-and-C-Exceptions-catch-all-in-one