error_handler.cpp

View page source

Replacing The CppAD Error Handler: Example and Test

# 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;
}