Cleanup a bulky expression, document implementation details
This commit is contained in:
parent
4ebbfea623
commit
a899cecb11
@ -4741,6 +4741,35 @@ class ExceptionMatcherImpl {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// If the matchee raises an exception of a wrong type, we'd like to
|
||||||
|
// catch it and print its message and type. To do that, we add an additional
|
||||||
|
// catch clause:
|
||||||
|
//
|
||||||
|
// try { ... }
|
||||||
|
// catch (const Err&) { /* an expected exception */ }
|
||||||
|
// catch (const std::exception&) { /* exception of a wrong type */ }
|
||||||
|
//
|
||||||
|
// However, if the `Err` itself is `std::exception`, we'd end up with two
|
||||||
|
// identical `catch` clauses:
|
||||||
|
//
|
||||||
|
// try { ... }
|
||||||
|
// catch (const std::exception&) { /* an expected exception */ }
|
||||||
|
// catch (const std::exception&) { /* exception of a wrong type */ }
|
||||||
|
//
|
||||||
|
// This can cause a warning or an error in some compilers. To resolve
|
||||||
|
// the issue, we use a fake error type whenever `Err` is `std::exception`:
|
||||||
|
//
|
||||||
|
// try { ... }
|
||||||
|
// catch (const std::exception&) { /* an expected exception */ }
|
||||||
|
// catch (const NeverThrown&) { /* exception of a wrong type */ }
|
||||||
|
using DefaultExceptionType = typename std::conditional<
|
||||||
|
std::is_same<
|
||||||
|
typename std::remove_cv<
|
||||||
|
typename std::remove_reference<Err>::type>::type,
|
||||||
|
std::exception>::value,
|
||||||
|
const NeverThrown&,
|
||||||
|
const std::exception&>::type;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ExceptionMatcherImpl(Matcher<const Err&> matcher)
|
ExceptionMatcherImpl(Matcher<const Err&> matcher)
|
||||||
: matcher_(std::move(matcher)) {}
|
: matcher_(std::move(matcher)) {}
|
||||||
@ -4771,14 +4800,7 @@ class ExceptionMatcherImpl {
|
|||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (
|
} catch (DefaultExceptionType err) {
|
||||||
typename std::conditional<
|
|
||||||
std::is_same<
|
|
||||||
typename std::remove_cv<
|
|
||||||
typename std::remove_reference<Err>::type>::type,
|
|
||||||
std::exception>::value,
|
|
||||||
const NeverThrown&,
|
|
||||||
const std::exception&>::type const& err) {
|
|
||||||
#if GTEST_HAS_RTTI
|
#if GTEST_HAS_RTTI
|
||||||
*listener << "throws an exception of type "
|
*listener << "throws an exception of type "
|
||||||
<< GetTypeName(typeid(err)) << " ";
|
<< GetTypeName(typeid(err)) << " ";
|
||||||
|
Loading…
Reference in New Issue
Block a user