"参数不正确" MFC例外

时间:2015-05-27 15:03:26

标签: c++ exception-handling mfc

这是原生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();
}

3 个答案:

答案 0 :(得分: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();
}

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;
}

nLength == -1,因此也是例外。

答案 1 :(得分:2)

答案是:

catch ( const COleException * e )

我正在使用catch ( const COleException & e ),因为所有教科书都说应该。哦,好吧。

详细信息可以在Exception Handling in MFC找到,特别是Exceptions: Catching and Deleting Exceptions

答案 2 :(得分:0)

请注意,此无效的参数异常现在可以通过调用UpdateAllViews()来实现。我通过 MFC libraries 深入了代码。它是由macro生成的,该import Vue from 'vue' import JDTable from 'vue-jd-table'; import App from './App.vue' import "@fortawesome/fontawesome-free/css/all.min.css"; import 'vue-jd-table/dist/jd-table.min.css'; Vue.config.productionTip = false Vue.component( 'jdtable',JDTable ); new Vue ({ render: h => h(App), }).$mount( '#app' ); 仅为发布版本生成抛出。

由于它是如此之深,因此它可以通过其他几种功能实现。