From a38c06e0efe8eda306e201decb295062d8748b7f Mon Sep 17 00:00:00 2001 From: Pavol Juhas Date: Fri, 10 May 2019 17:01:52 -0400 Subject: [PATCH 1/2] BUG: skip exception when checking SpaceGroup origins CreateCrystalFromCIF checks possible SpaceGroup origins with SpaceGroup::ChangeSpaceGroup() so we need to skip exception due to invalid SG symbol. --- ObjCryst/ObjCryst/CIF.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ObjCryst/ObjCryst/CIF.cpp b/ObjCryst/ObjCryst/CIF.cpp index c6b49647..ab4dacb8 100644 --- a/ObjCryst/ObjCryst/CIF.cpp +++ b/ObjCryst/ObjCryst/CIF.cpp @@ -1120,8 +1120,15 @@ Crystal* CreateCrystalFromCIF(CIF &cif,const bool verbose,const bool checkSymAsX unsigned int bestscore=0; for(vector::const_iterator posOrig=origin_list.begin();posOrig!=origin_list.end();++posOrig) { - // The origin extension may not make sense, but this will be handled internally in SpaceGroup - pCryst->GetSpaceGroup().ChangeSpaceGroup(hmorig+*posOrig); + // The origin extension may not make sense, so we need to watch for ObjCrystException + try + { + pCryst->GetSpaceGroup().ChangeSpaceGroup(hmorig+*posOrig); + } + catch(ObjCrystException e) + { + continue; + } // If the symbol is the same as before, the origin probably was not understood - no need to test if((posOrig!=origin_list.begin())&&(pCryst->GetSpaceGroup().GetName()==bestsymbol)) continue; From 9a18bbd8ec7ef64834444289c192dacbca189f9a Mon Sep 17 00:00:00 2001 From: Pavol Juhas Date: Fri, 10 May 2019 18:34:48 -0400 Subject: [PATCH 2/2] Raise invalid_argument when InitSpaceGroup fails Throw `invalid_argument` instead of `ObjCrystException`. Avoid XML state files that are created by ObjCrystException. --- ObjCryst/ObjCryst/CIF.cpp | 4 ++-- ObjCryst/ObjCryst/SpaceGroup.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ObjCryst/ObjCryst/CIF.cpp b/ObjCryst/ObjCryst/CIF.cpp index ab4dacb8..96e75e3c 100644 --- a/ObjCryst/ObjCryst/CIF.cpp +++ b/ObjCryst/ObjCryst/CIF.cpp @@ -1120,12 +1120,12 @@ Crystal* CreateCrystalFromCIF(CIF &cif,const bool verbose,const bool checkSymAsX unsigned int bestscore=0; for(vector::const_iterator posOrig=origin_list.begin();posOrig!=origin_list.end();++posOrig) { - // The origin extension may not make sense, so we need to watch for ObjCrystException + // The origin extension may not make sense, so we need to watch for exception try { pCryst->GetSpaceGroup().ChangeSpaceGroup(hmorig+*posOrig); } - catch(ObjCrystException e) + catch(invalid_argument) { continue; } diff --git a/ObjCryst/ObjCryst/SpaceGroup.cpp b/ObjCryst/ObjCryst/SpaceGroup.cpp index 9b4a7cf8..355ba47b 100644 --- a/ObjCryst/ObjCryst/SpaceGroup.cpp +++ b/ObjCryst/ObjCryst/SpaceGroup.cpp @@ -603,7 +603,7 @@ void SpaceGroup::InitSpaceGroup(const string &spgId) { (*fpObjCrystInformUser)("Could not interpret Spacegroup Symbol:"+spgId); string emsg = "Space group symbol '" + spgId + "' not recognized"; - throw ObjCrystException(emsg); + throw invalid_argument(emsg); } } @@ -654,7 +654,7 @@ void SpaceGroup::InitSpaceGroup(const string &spgId) } VFN_DEBUG_EXIT("SpaceGroup::InitSpaceGroup() could not interpret spacegroup:"<GetCCTbxSpg().match_tabulated_settings().extension();