1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
// SPDX-FileCopyrightText: Bradley M. Bell <bradbell@seanet.com>
// SPDX-FileContributor: 2003-22 Bradley M. Bell
// ----------------------------------------------------------------------------
/*
{xrst_begin error_handler.cpp}
Replacing The CppAD Error Handler: Example and Test
###################################################
{xrst_literal
// BEGIN C++
// END C++
}
{xrst_end error_handler.cpp}
*/
// BEGIN C++
# include <cppad/utility/error_handler.hpp>
# include <cstring>
namespace {
void myhandler(
bool known ,
int line ,
const char *file ,
const char *exp ,
const char *msg )
{ // error handler must not return, so throw an exception
throw line;
}
}
bool ErrorHandler(void)
{ using CppAD::ErrorHandler;
int lineMinusFive = 0;
// replace the default CppAD error handler
ErrorHandler info(myhandler);
// set ok to false unless catch block is executed
bool ok = false;
// use try / catch because handler throws an exception
try {
// set the static variable Line to next source code line
lineMinusFive = __LINE__;
// can call myhandler anywhere that ErrorHandler is defined
ErrorHandler::Call(
true , // reason for the error is known
__LINE__ , // current source code line number
__FILE__ , // current source code file name
"1 > 0" , // an intentional error condition
"Testing ErrorHandler" // reason for error
);
}
catch ( int line )
{ // check value of the line number that was passed to handler
ok = (line == lineMinusFive + 5);
}
// info drops out of scope and the default CppAD error handler
// is restored when this routine returns.
return ok;
}
// END C++
|