试图在MFC的CString :: Format中捕获异常

时间:2013-09-13 01:35:01

标签: c++ winapi exception exception-handling mfc

我正在使用一个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 ++调试器启动并显示:

enter image description here

然后我尝试了这个:

try
{
    //Do the Format function here
}
catch(int e)
{
    //Do the logging
}

但那也没有抓住它。

那我怎么能抓住这个错误呢?

PS。我还有第二个问题。是否有一种简单的方法来覆盖MFC功能,例如Format

3 个答案:

答案 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