-
Notifications
You must be signed in to change notification settings - Fork 4.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Throw a separate exception if ESGetToken is uninitialized #30506
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -111,10 +111,9 @@ namespace edm { | |||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
template <typename HolderT> | ||||||||||||||||||||||||||||||
bool get(char const* iName, HolderT& iHolder) const { | ||||||||||||||||||||||||||||||
if | ||||||||||||||||||||||||||||||
UNLIKELY(requireTokens_) { | ||||||||||||||||||||||||||||||
throwCalledGetWithoutToken(heterocontainer::className<typename HolderT::value_type>(), iName); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
if UNLIKELY (requireTokens_) { | ||||||||||||||||||||||||||||||
throwCalledGetWithoutToken(heterocontainer::className<typename HolderT::value_type>(), iName); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
typename HolderT::value_type const* value = nullptr; | ||||||||||||||||||||||||||||||
ComponentDescription const* desc = nullptr; | ||||||||||||||||||||||||||||||
std::shared_ptr<ESHandleExceptionFactory> whyFailedFactory; | ||||||||||||||||||||||||||||||
|
@@ -136,10 +135,9 @@ namespace edm { | |||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
template <typename HolderT> | ||||||||||||||||||||||||||||||
bool get(ESInputTag const& iTag, HolderT& iHolder) const { | ||||||||||||||||||||||||||||||
if | ||||||||||||||||||||||||||||||
UNLIKELY(requireTokens_) { | ||||||||||||||||||||||||||||||
throwCalledGetWithoutToken(heterocontainer::className<typename HolderT::value_type>(), iTag.data().c_str()); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
if UNLIKELY (requireTokens_) { | ||||||||||||||||||||||||||||||
throwCalledGetWithoutToken(heterocontainer::className<typename HolderT::value_type>(), iTag.data().c_str()); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
typename HolderT::value_type const* value = nullptr; | ||||||||||||||||||||||||||||||
ComponentDescription const* desc = nullptr; | ||||||||||||||||||||||||||||||
std::shared_ptr<ESHandleExceptionFactory> whyFailedFactory; | ||||||||||||||||||||||||||||||
|
@@ -207,26 +205,32 @@ namespace edm { | |||||||||||||||||||||||||||||
protected: | ||||||||||||||||||||||||||||||
template <template <typename> typename H, typename T, typename R> | ||||||||||||||||||||||||||||||
H<T> getHandleImpl(ESGetToken<T, R> const& iToken) const { | ||||||||||||||||||||||||||||||
if | ||||||||||||||||||||||||||||||
UNLIKELY(iToken.transitionID() != transitionID()) { throwWrongTransitionID(); } | ||||||||||||||||||||||||||||||
assert(iToken.isInitialized()); | ||||||||||||||||||||||||||||||
if UNLIKELY (not iToken.isInitialized()) { | ||||||||||||||||||||||||||||||
std::rethrow_exception(makeUninitializedTokenException(this->key(), DataKey::makeTypeTag<T>())); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
if UNLIKELY (iToken.transitionID() != transitionID()) { | ||||||||||||||||||||||||||||||
throwWrongTransitionID(); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
assert(getTokenIndices_); | ||||||||||||||||||||||||||||||
//need to check token has valid index | ||||||||||||||||||||||||||||||
if | ||||||||||||||||||||||||||||||
UNLIKELY(not iToken.hasValidIndex()) { return invalidTokenHandle<H>(iToken); } | ||||||||||||||||||||||||||||||
if UNLIKELY (not iToken.hasValidIndex()) { | ||||||||||||||||||||||||||||||
return invalidTokenHandle<H>(iToken); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ... if this check (which is the only caller of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the data product is not available that would happen There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Then the exception message of that appears to be confusing. cmssw/FWCore/Framework/interface/EventSetupRecord.h Lines 252 to 256 in cea1d1b
just leads to makeInvalidTokenException() that createscmssw/FWCore/Framework/src/EventSetupRecord.cc Lines 73 to 81 in cea1d1b
that suggests to call consumes, which should be unrelated to (in)availability of the data product. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We concluded that a valid transition ID and invalid index should not happen, so I'll replace this exception message. |
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
auto proxyIndex = getTokenIndices_[iToken.index().value()]; | ||||||||||||||||||||||||||||||
if | ||||||||||||||||||||||||||||||
UNLIKELY(proxyIndex.value() == std::numeric_limits<int>::max()) { return noProxyHandle<H>(iToken); } | ||||||||||||||||||||||||||||||
if UNLIKELY (proxyIndex.value() == std::numeric_limits<int>::max()) { | ||||||||||||||||||||||||||||||
return noProxyHandle<H>(iToken); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
T const* value = nullptr; | ||||||||||||||||||||||||||||||
ComponentDescription const* desc = nullptr; | ||||||||||||||||||||||||||||||
std::shared_ptr<ESHandleExceptionFactory> whyFailedFactory; | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
impl_->getImplementation(value, proxyIndex, H<T>::transientAccessOnly, desc, whyFailedFactory, eventSetupImpl_); | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
if | ||||||||||||||||||||||||||||||
UNLIKELY(not value) { return H<T>(std::move(whyFailedFactory)); } | ||||||||||||||||||||||||||||||
if UNLIKELY (not value) { | ||||||||||||||||||||||||||||||
return H<T>(std::move(whyFailedFactory)); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
return H<T>(value, desc); | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
@@ -251,8 +255,9 @@ namespace edm { | |||||||||||||||||||||||||||||
template <template <typename> typename H, typename T, typename R> | ||||||||||||||||||||||||||||||
H<T> invalidTokenHandle(ESGetToken<T, R> const& iToken) const { | ||||||||||||||||||||||||||||||
auto const key = this->key(); | ||||||||||||||||||||||||||||||
return H<T>{ | ||||||||||||||||||||||||||||||
makeESHandleExceptionFactory([key] { return makeInvalidTokenException(key, DataKey::makeTypeTag<T>()); })}; | ||||||||||||||||||||||||||||||
return H<T>{makeESHandleExceptionFactory([key, transitionID = iToken.transitionID()] { | ||||||||||||||||||||||||||||||
return makeInvalidTokenException(key, DataKey::makeTypeTag<T>(), transitionID); | ||||||||||||||||||||||||||||||
})}; | ||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
template <template <typename> typename H, typename T, typename R> | ||||||||||||||||||||||||||||||
|
@@ -269,7 +274,8 @@ namespace edm { | |||||||||||||||||||||||||||||
ComponentDescription const*& iDesc, | ||||||||||||||||||||||||||||||
bool iTransientAccessOnly) const; | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
static std::exception_ptr makeInvalidTokenException(EventSetupRecordKey const&, TypeTag const&); | ||||||||||||||||||||||||||||||
static std::exception_ptr makeUninitializedTokenException(EventSetupRecordKey const&, TypeTag const&); | ||||||||||||||||||||||||||||||
static std::exception_ptr makeInvalidTokenException(EventSetupRecordKey const&, TypeTag const&, unsigned int); | ||||||||||||||||||||||||||||||
void throwWrongTransitionID() const; | ||||||||||||||||||||||||||||||
static void throwCalledGetWithoutToken(const char* iTypeName, const char* iLabel); | ||||||||||||||||||||||||||||||
// ---------- member data -------------------------------- | ||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Dr15Jones I ended up re-using
makeInvalidTokenException()
because the exception message of that was about the same I had in mind. But that makes me ask ...