【发布时间】:2013-09-13 01:35:00
【问题描述】:
我正在处理一个具有许多 MFC 字符串格式化函数的 C++ 项目(我不是该项目的作者)。不幸的是,%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?
【问题讨论】:
-
在做出如此巨大的改变之前,也许看看一些静态分析工具,比如 Visual Studio 中包含的工具,甚至免费的 Cppcheck 都可以帮助您找到并消除大部分错误。
-
作为记录,运行 VS2015 的代码分析工具并不能捕获,例如,格式变量(%s、%d 等)的数量与参数的数量不匹配。
标签: c++ winapi exception exception-handling mfc