这是原生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();
}
答案 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' );
仅为发布版本生成抛出。
由于它是如此之深,因此它可以通过其他几种功能实现。