ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Обработка ошибок


Примеры в этом руководстве опустили необходимую проверку ошибок, чтобы упростить код. Однако, вы будете всегда хотеть проверить состояние возвращения и брать соответствующее действие. Следующий пример показывает соответствующему использованию проверки ошибок для нескольких примеров, показанных сначала в главе 2, “ Учебник для начинающих Базы данных. ”

Acad::ErrorStatus

createCircle(AcDbObjectId& circleId)

{

circleId = AcDbObjectId::kNull;

AcGePoint3d center(9.0, 3.0, 0.0);

AcGeVector3d normal(0.0, 0.0, 1.0);

AcDbCircle *pCirc = new AcDbCircle(center, normal, 2.0);

if (pCirc == NULL)

return Acad::eOutOfMemory;

AcDbBlockTable *pBlockTable;

Acad::ErrorStatus es =

acdbHostApplicationServices()->workingDatabase()->

getSymbolTable(pBlockTable, AcDb::kForRead);

if (es != Acad::eOk) {

delete pCirc;

return es;

}

AcDbBlockTableRecord *pBlockTableRecord;

es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);

if (es != Acad::eOk) {

Acad::ErrorStatus es2 = pBlockTable->close();

if (es2 != Acad::eOk) {

acrx_abort("\nApp X failed to close Block" " Table. Error: %d", acadErrorStatusText(es2));

}

delete pCirc;

return es;

}

es = pBlockTable->close();

if (es != Acad::eOk) {

acrx_abort("\nApp X failed to close Block Table."

" Error: %d", acadErrorStatusText(es));

}

es = pBlockTableRecord->appendAcDbEntity(circleId,

pCirc);

if (es != Acad::eOk) {

Acad::ErrorStatus es2 = pBlockTableRecord->close();

if (es2 != Acad::eOk) {

acrx_abort("\nApp X failed to close"

" Model Space Block Record. Error: %s",

acadErrorStatusText(es2));

}

delete pCirc;

return es;

}

es = pBlockTableRecord->close();

if (es != Acad::eOk) {

acrx_abort("\nApp X failed to close"

" Model Space Block Record. Error: %d",

acadErrorStatusText(es));

}

es = pCirc->close();

if (es != Acad::eOk) {

acrx_abort("\nApp X failed to"

" close circle entity. Error: %d",


acadErrorStatusText(es));

}

return es;

}

Acad::ErrorStatus

createNewLayer()

{

AcDbLayerTableRecord *pLayerTableRecord

= new AcDbLayerTableRecord;

if (pLayerTableRecord == NULL)

return Acad::eOutOfMemory;

Acad::ErrorStatus es

= pLayerTableRecord->setName("ASDK_MYLAYER");

if (es != Acad::eOk) {

delete pLayerTableRecord;

return es;

}

AcDbLayerTable *pLayerTable;

es = acdbHostApplicationServices()->workingDatabase()->

getSymbolTable(pLayerTable, AcDb::kForWrite);

if (es != Acad::eOk) {

delete pLayerTableRecord;

return es;

}

// The linetype object ID default is 0, which is

// not a valid ID. Therefore, it must be set to a

// valid ID, the CONTINUOUS linetype.

// Other data members have valid defaults, so

// they can be left alone.

//

AcDbLinetypeTable *pLinetypeTbl;

es = acdbHostApplicationServices()->workingDatabase()->

getSymbolTable(pLinetypeTbl, AcDb::kForRead);

if (es != Acad::eOk) {

delete pLayerTableRecord;

es = pLayerTable->close();

if (es != Acad::eOk) {

acrx_abort("\nApp X failed to close Layer"

" Table. Error: %d",

acadErrorStatusText(es));

}

return es;

}

AcDbObjectId ltypeObjId;

es = pLinetypeTbl->getAt("CONTINUOUS", ltypeObjId);

if (es != Acad::eOk) {

delete pLayerTableRecord;

es = pLayerTable->close();

if (es != Acad::eOk) {

acrx_abort("\nApp X failed to close Layer"

" Table. Error: %d",

acadErrorStatusText(es));

}

return es;

}

pLayerTableRecord->setLinetypeObjectId(ltypeObjId);

es = pLayerTable->add(pLayerTableRecord);

if (es != Acad::eOk) {

Acad::ErrorStatus es2 = pLayerTable->close();

if (es2 != Acad::eOk) {

acrx_abort("\nApp X failed to close Layer"

" Table. Error: %d",

acadErrorStatusText(es2));

}

delete pLayerTableRecord;

return es;

}

es = pLayerTable->close();

if (es != Acad::eOk) {

acrx_abort("\nApp X failed to close Layer"

" Table. Error: %d",

acadErrorStatusText(es));

}

es = pLayerTableRecord->close();

if (es != Acad::eOk) {

acrx_abort("\nApp X failed to close Layer"

" Table Record. Error: %d",

acadErrorStatusText(es));

}

return es;

}


Содержание раздела