"参数不正确"MFC异常

Dis*_*ame 1 c++ mfc exception-handling

这是本机C++.没有涉及.NET框架.

我试图找出当CListBox获取无效参数时抛出的异常.原来MFC使用这个异常很多,但我无法确定抛出的实际异常类型.我在catch(int,const char ,std :)上尝试了很多不同的类型,但除了catch(...)之外唯一能捕获它的是(const void*).看看内存结构,我仍然不知道实际抛出的是什么.有人知道它是什么或如何确定它抛出了什么?

这是一个示例MFC应用程序.ListBox是一个CListBox.该应用程序只不过是VS自动构建的默认基于DialogBox的MFC应用程序.唯一的变化是我在OK按钮处理程序中添加了一个列表框和下面看到的代码.

void CMFCApplication1Dlg::OnBnClickedOk()
{
    try
    {
        CString Value;
        ListBox.GetText( -1, Value );
        Value = "none";
    }
    catch ( CException & exception )
    {
            exception.Delete();
    }
    catch ( const void * e )
    {
    }
    catch (...)
    {
    }

    CDialogEx::OnOK();
}
Run Code Online (Sandbox Code Playgroud)

ues*_*esp 5

要解释为什么你得到异常,看起来当你使用它的CString版本时,CListBox::GetText()如果传递的索引无效,将抛出一个E_INVALIDARG异常.跟踪MFC代码有点工作,但CListBox::GetText()看起来像:

void CListBox::GetText(int nIndex, CString& rString) const
{
        ASSERT(::IsWindow(m_hWnd));
        GetText(nIndex, rString.GetBufferSetLength(GetTextLen(nIndex)));
        rString.ReleaseBuffer();
}
Run Code Online (Sandbox Code Playgroud)

CListBox::GetTextLen(-1)将返回LB_ERR哪个-1.如果您遵循代码,CString::GetBufferSetLength()最终最终会CString::SetLength():

void SetLength(_In_ int nLength)
{
      ATLASSERT( nLength >= 0 );
      ATLASSERT( nLength <= GetData()->nAllocLength );

      if( nLength < 0 || nLength > GetData()->nAllocLength)
             AtlThrow(E_INVALIDARG);

      GetData()->nDataLength = nLength;
      m_pszData[nLength] = 0;
}
Run Code Online (Sandbox Code Playgroud)

nLength == -1并且因此异常.