Don't throw when already handling an exception as it would result in a call to
terminate() and no useful information about the test failure would be given.
Abort ourselves instead to at least give the message about the assert failure.
This should help debug the mysterious ListCtrlTestCase failures in buildbot
wxGTK builds.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65760
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
#include "wx/afterstd.h"
#include "wx/cmdline.h"
#include "wx/afterstd.h"
#include "wx/cmdline.h"
#include <iostream>
#ifdef __WXMSW__
#include <iostream>
#ifdef __WXMSW__
const wxString& cond,
const wxString& msg)
{
const wxString& cond,
const wxString& msg)
{
- // can't throw from other threads, die immediately
+ // Determine whether we can safely throw an exception to just make the test
+ // fail or whether we need to abort (in this case "msg" will contain the
+ // explanation why did we decide to do it).
+ wxString abortReason;
if ( !wxIsMainThread() )
{
if ( !wxIsMainThread() )
{
- wxPrintf("%s in a worker thread -- aborting.",
- FormatAssertMessage(file, line, func, cond, msg));
- fflush(stdout);
- _exit(-1);
+ // Exceptions thrown from worker threads are not caught currently and
+ // so we'd just die without any useful information -- abort instead.
+ abortReason = "in a worker thread";
+ }
+ else if ( uncaught_exception() )
+ {
+ // Throwing while already handling an exception would result in
+ // terminate() being called and we wouldn't get any useful information
+ // about why the test failed then.
+ abortReason = "while handling an exception";
+ }
+ else // Can "safely" throw from here.
+ {
+ throw TestAssertFailure(file, line, func, cond, msg);
- throw TestAssertFailure(file, line, func, cond, msg);
+ wxFprintf(stderr, "%s %s -- aborting.",
+ FormatAssertMessage(file, line, func, cond, msg),
+ abortReason);
+ fflush(stderr);
+ _exit(-1);
}
#endif // wxDEBUG_LEVEL
}
#endif // wxDEBUG_LEVEL