mirror of
https://github.com/catchorg/Catch2.git
synced 2025-09-27 23:05:40 +02:00
Allow composability of unhandled exception filters (#3033)
The change is very simple. If a handler previously existed, Catch2 will invoke it after printing out its output. I've also updated the comment to better reflect that it's returning EXCEPTION_CONTINUE_SEARCH even in scenarios where the exception is one that the library cares about.
This commit is contained in:
@@ -86,23 +86,27 @@ namespace Catch {
|
|||||||
{ EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" },
|
{ EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Since we do not support multiple instantiations, we put these
|
||||||
|
// into global variables and rely on cleaning them up in outlined
|
||||||
|
// constructors/destructors
|
||||||
|
static LPTOP_LEVEL_EXCEPTION_FILTER previousTopLevelExceptionFilter = nullptr;
|
||||||
|
|
||||||
|
|
||||||
static LONG CALLBACK topLevelExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) {
|
static LONG CALLBACK topLevelExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) {
|
||||||
for (auto const& def : signalDefs) {
|
for (auto const& def : signalDefs) {
|
||||||
if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) {
|
if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) {
|
||||||
reportFatal(def.name);
|
reportFatal(def.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If its not an exception we care about, pass it along.
|
// If a filter was previously registered, invoke it
|
||||||
|
if (previousTopLevelExceptionFilter) {
|
||||||
|
return previousTopLevelExceptionFilter(ExceptionInfo);
|
||||||
|
}
|
||||||
|
// Otherwise, pass along all exceptions.
|
||||||
// This stops us from eating debugger breaks etc.
|
// This stops us from eating debugger breaks etc.
|
||||||
return EXCEPTION_CONTINUE_SEARCH;
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Since we do not support multiple instantiations, we put these
|
|
||||||
// into global variables and rely on cleaning them up in outlined
|
|
||||||
// constructors/destructors
|
|
||||||
static LPTOP_LEVEL_EXCEPTION_FILTER previousTopLevelExceptionFilter = nullptr;
|
|
||||||
|
|
||||||
|
|
||||||
// For MSVC, we reserve part of the stack memory for handling
|
// For MSVC, we reserve part of the stack memory for handling
|
||||||
// memory overflow structured exception.
|
// memory overflow structured exception.
|
||||||
FatalConditionHandler::FatalConditionHandler() {
|
FatalConditionHandler::FatalConditionHandler() {
|
||||||
|
Reference in New Issue
Block a user