Teuchos Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Teuchos_TestForException.cpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Teuchos: Common Tools Package
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
44 
45 #include <iostream>
46 
47 //
48 // ToDo: Make these functions thread-safe!
49 //
50 
51 
52 namespace {
53 
54 
55 int throwNumber = 0;
56 
57 
58 bool& loc_enableStackTrace()
59 {
60  static bool static_enableStackTrace =
61 #ifdef HAVE_TEUCHOS_DEFAULT_STACKTRACE
62  true
63 #else
64  false
65 #endif
66  ;
67  return static_enableStackTrace;
68 }
69 
70 
71 } // namespace
72 
73 
75 {
76  ++throwNumber;
77 }
78 
79 
81 {
82  return throwNumber;
83 }
84 
85 
86 void Teuchos::TestForException_break( const std::string &errorMsg )
87 {
88  size_t break_on_me;
89  break_on_me = errorMsg.length(); // Use errMsg to avoid compiler warning.
90  if (break_on_me) {} // Avoid warning
91  // Above is just some statement for the debugger to break on. Note: now is
92  // a good time to examine the stack trace and look at the error message in
93  // 'errorMsg' to see what happened. In GDB just type 'where' or you can go
94  // up by typing 'up' and moving up in the stack trace to see where you are
95  // and how you got to this point in the code where you are throwing this
96  // exception! Typing in a 'p errorMsg' will show you what the error message
97  // is. Also, you should consider adding a conditional break-point in this
98  // function based on a specific value of 'throwNumber' if the exception you
99  // want to examine is not the first exception thrown.
100 }
101 
102 
104 {
105  loc_enableStackTrace() = enableStrackTrace;
106 }
107 
108 
110 {
111  return loc_enableStackTrace();
112 }
113 
114 void Teuchos::TestForTermination_terminate(const std::string &msg) {
115  std::ostringstream omsg;
116  if (GlobalMPISession::getNProc() > 1) {
117  omsg << "p="<<GlobalMPISession::getRank()<<": ";
118  }
119  omsg << msg << "\n";
120  std::cerr << omsg.str();
121  std::terminate();
122 }
123 // NOTE: The above usage of ostringstream is so that the output to std::cerr
124 // is done as one string. This should help to avoid jumbled output like is
125 // occurring in tests that grep for this output (see #3163).
TEUCHOSCORE_LIB_DLL_EXPORT void TestForException_setEnableStacktrace(bool enableStrackTrace)
Set at runtime if stacktracing functionality is enabled when * exceptions are thrown.
TEUCHOSCORE_LIB_DLL_EXPORT[[noreturn]] void TestForTermination_terminate(const std::string &msg)
Prints the message to std::cerr and calls std::terminate.
TEUCHOSCORE_LIB_DLL_EXPORT int TestForException_getThrowNumber()
Increment the throw number.
TEUCHOSCORE_LIB_DLL_EXPORT void TestForException_incrThrowNumber()
Increment the throw number.
TEUCHOSCORE_LIB_DLL_EXPORT void TestForException_break(const std::string &msg)
The only purpose for this function is to set a breakpoint.
A MPI utilities class, providing methods for initializing, finalizing, and querying the global MPI se...
Standard test and throw macros.
TEUCHOSCORE_LIB_DLL_EXPORT bool TestForException_getEnableStacktrace()
Get at runtime if stacktracing functionality is enabled when exceptions are thrown.