better exception messages
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user