better exception messages

This commit is contained in:
mrkraimer
2019-03-31 15:38:13 -04:00
parent 20e55d5bca
commit 5f42eec15a

View File

@ -168,7 +168,7 @@ PVFieldPtr PVCopy::getMasterPVField(size_t structureOffset)
node = getMasterNode(snode,structureOffset); node = getMasterNode(snode,structureOffset);
} }
if(!node) { if(!node) {
throw std::invalid_argument( throw std::logic_error(
"PVCopy::getMasterPVField: structureOffset not valid"); "PVCopy::getMasterPVField: structureOffset not valid");
} }
size_t diff = structureOffset - node->structureOffset; size_t diff = structureOffset - node->structureOffset;
@ -248,7 +248,7 @@ PVStructurePtr PVCopy::getOptions(std::size_t fieldOffset)
} }
} }
if(okToContinue) continue; if(okToContinue) continue;
throw std::invalid_argument("fieldOffset not valid"); throw std::logic_error("PVCopy logic error: fieldOffset not valid");
} }
} }
@ -467,7 +467,7 @@ StructureConstPtr PVCopy::createStructure(
if(numsubfields==0) { if(numsubfields==0) {
std::stringstream ss; std::stringstream ss;
ss << pvFromRequest << "\n"; ss << pvFromRequest << "\n";
string val("a requested field was not found in\n"); string val("no fields from the following request were found\n");
val += ss.str(); val += ss.str();
throw std::invalid_argument(val); throw std::invalid_argument(val);
} }
@ -493,10 +493,14 @@ CopyNodePtr PVCopy::createStructureNodes(
requestPVStructure->getSubField<PVStructure>("_options"); requestPVStructure->getSubField<PVStructure>("_options");
PVFieldPtr pvMasterField = pvMasterStructure->getSubField(fieldName); PVFieldPtr pvMasterField = pvMasterStructure->getSubField(fieldName);
if(!pvMasterField) { if(!pvMasterField) {
throw std::logic_error("did not find field in master"); throw std::logic_error("PVCopy logic error: did not find field in master");
} }
size_t numberRequest = requestPVStructure->getPVFields().size(); size_t numberRequest = requestPVStructure->getPVFields().size();
if(pvSubFieldOptions) numberRequest--; bool haveOptions = false;
if(pvSubFieldOptions) {
numberRequest--;
haveOptions = true;
}
if(numberRequest>0) { if(numberRequest>0) {
Type copyType = copyPVField->getField()->getType(); Type copyType = copyPVField->getField()->getType();
if(copyType==epics::pvData::structure) { if(copyType==epics::pvData::structure) {
@ -510,27 +514,29 @@ CopyNodePtr PVCopy::createStructureNodes(
if(numberRequest!=1) { if(numberRequest!=1) {
std::stringstream ss; std::stringstream ss;
ss << pvFromRequest << "\n"; ss << pvFromRequest << "\n";
string val("union field has more than one subfield in\n"); string val("In the following request a union field has more than one subfield in\n");
val += ss.str(); val += ss.str();
throw std::logic_error(val); throw std::invalid_argument(val);
} }
PVUnionPtr pvUnion = static_pointer_cast<PVUnion>(pvMasterField); PVUnionPtr pvUnion = static_pointer_cast<PVUnion>(pvMasterField);
std::string selectedName = pvUnion->getSelectedFieldName(); std::string selectedName = pvUnion->getSelectedFieldName();
PVFieldPtrArray const & pvFields = requestPVStructure->getPVFields(); PVFieldPtrArray const & pvFields = requestPVStructure->getPVFields();
size_t len = pvFields.size(); size_t len = pvFields.size();
if(len!=1) { if(len>2 || (haveOptions && len!=2)) {
std::stringstream ss; std::stringstream ss;
ss << pvFromRequest << "\n"; ss << pvFromRequest << "\n";
string val("subfield of union has more than one subfield in\n"); string val("PVCopy logic error: pvRequest is\n");
val += ss.str(); val += ss.str();
throw std::invalid_argument(val); throw std::logic_error(val);
} }
PVFieldPtr pvRequestValue = pvFields[0]; size_t indRequestValue = 0;
if((pvFields[0]->getFieldName().compare("_options"))==0) indRequestValue = 1;
PVFieldPtr pvRequestValue = pvFields[indRequestValue];
if(pvRequestValue) { if(pvRequestValue) {
string requestName = pvRequestValue->getFieldName(); string requestName = pvRequestValue->getFieldName();
if(requestName.compare(selectedName)!=0) { if(requestName.compare(selectedName)!=0) {
std::stringstream ss; std::stringstream ss;
ss << pvFromRequest << "\n"; ss << pvFromCopy << "\n";
string requestName = pvRequestValue->getFieldName(); string requestName = pvRequestValue->getFieldName();
string val("field "); string val("field ");
val += requestName + " does not match union type in\n"; val += requestName + " does not match union type in\n";
@ -540,9 +546,9 @@ CopyNodePtr PVCopy::createStructureNodes(
} }
} else { } else {
std::stringstream ss; std::stringstream ss;
ss << pvFromRequest << "\n"; ss << pvFromCopy << "\n";
string val("requested field "); string val("requested a subfield of field ");
val += fieldName + " does not have type structure in\n"; val += fieldName + " which does not have type structure in\n";
val += ss.str(); val += ss.str();
throw std::invalid_argument(val); throw std::invalid_argument(val);
} }