【MSCE c++】在调用NormalCellHeaderHandler::CreateGroupCellElement(eeh, agenda, L"")时Microstation直接崩溃了,请问如何捕获异常保证程序不崩溃?

调用NormalCellHeaderHandler::CreateGroupCellElement(eeh, agenda, L“”)接口时Microstation崩溃了,报了如图所示错误: 请问怎么

捕获这里的异常?

我尝试用

 

try{} catch(Exception e)

可是还是没能捕获到这里的异常,还是会崩溃。

  • MDL开发用try...catch...这一套不管用的。请提供您的完整代码,包括您的eeh和agenda都是如何声明和获取的。最后一个参数默认为NULL,可以不给试一下。



  • 完整代码如下:

    bool ElementInfAchieve::createElms(ElmGraphic* pgra, ModelElementID& elid)
    {
    if (pgra->ptrgeos.size() == 0) return false;
    DgnModelP pModel = ACTIVEMODEL->GetDgnModelP();
    CDgnModelMethod::getModel(elid.modid);

    EditElementHandle eeh;
    ElementRefP oldref = nullptr;
    if(BaseDraw::getElmFromModElmId(eeh, elid))
    oldref = eeh.GetElementRef();
    ElementPropertiesSetterPtr psetter = nullptr;

    bool rs = false;
    if (pgra->ptrgeos.size() ==1) {
        if (pgra->eppys.size() >0)
            psetter = convertSetter(&pgra->eppys[0]);
        if (createElm(pgra->ptrgeos[0], psetter, eeh, pModel)) {
            rs = true;
        }
    }
    else {
        ElementAgenda agenda;
        for (int i = 0; i < pgra->ptrgeos.size(); i++) {
            if (pgra->eppys.size() >i)
            psetter = convertSetter(&pgra->eppys[i]);
            EditElementHandle eehi;
            if (createElm(pgra->ptrgeos[i], psetter, eehi, pModel)) {
                agenda.Insert(eehi);
            }
        }


        if (agenda.size() > 0) {

            try {
                if (BentleyStatus::SUCCESS == NormalCellHeaderHandler::CreateGroupCellElement(eeh, agenda, L"")) {
                    rs = true;
                }
            }
            catch (exception e)
            {

            }
        }
    }
    if (rs) {
        if (pgra->links != nullptr) {
            DependencyLinkage depLinkage = BaseDraw::getLinkFromXat(*pgra->links.get());
            DependencyManagerLinkage::AppendLinkage(eeh, depLinkage, 0);
        }
        if (oldref != nullptr)
            return SUCCESS == eeh.ReplaceInModel(oldref);
        else {
            if (SUCCESS == eeh.AddToModel()) {
                elid = BaseDraw::getModElmId(eeh);
            }
        }
    }
    return rs;
    }

  • 您的代码写得有些复杂。我写了如下测试代码专门测试该函数,是能正确工作的。打开任意一个dgn文件,用选择集工具选中几个元素,然后执行如下代码就能将这几个元素添加到一个组中。请您对照该测试代码找出您代码中的问题。另外提醒一下,我们论坛有专门插入代码的工具,请阅读置顶的【发帖指南】学习如何使用。谢谢!

    void CreateGroupCellElementTest()
    {
    	if (!SelectionSetManager::GetManager().IsActive())
    	{
    		mdlDialog_dmsgsPrint(L"No selection set found");
    		return;
    	}
    	ElementAgenda agenda;
    	SelectionSetManager::GetManager().BuildAgenda(agenda);
    	
    	EditElementHandle eeh;
    	if (SUCCESS == NormalCellHeaderHandler::CreateGroupCellElement(eeh, agenda))
    	{
    		eeh.AddToModel();
    		mdlDialog_dmsgsPrint(L"CreateGroupCellElement is successful");
    	}
    	else
    		mdlDialog_dmsgsPrint(L"CreateGroupCellElement failed");
    }