1. Exceptions
TRIQS defines special exceptions, with the following characteristics :
they derives from std::exceptions
their method .what() returns :
the date and time of the exception (useful in long QMC computations…).
the file and line where the exception occurred
an additionnal error message (see example below). The error behaves like a std::stringstream, one can accumulate any message
their method .what() returns : * a complete stack strace of the C++ code at the exception point, with demangling of the function name (on gcc and clang).
In addition, we provide a TRIQS_RUNTIME_ERROR macro to throw exception easily, Cf example below.
Note
For uniformity, it is highly recommended to use these macros when developing for TRIQS.
Example:
// automatically included in e.g. arrays, gfs, any triqs library...
#include <triqs/utility/exceptions.hpp>
int main() {
try {
if (2 != 3) TRIQS_RUNTIME_ERROR << " The condition is false because " << 2 << "!=" << 3;
} catch (...) {}
}
The exception can of course be caught :
// automatically included in e.g. arrays, gfs, any triqs library...
#include <triqs/utility/exceptions.hpp>
#include <iostream>
void f() {
try {
if (2 != 3) TRIQS_RUNTIME_ERROR << " The condition is false because " << 2 << "!=" << 3;
} catch (triqs::runtime_error const &e) {
std::cout << "caught error \n" << e.what() << std::endl;
std::cout << "C++ trace = \n" << e.trace() << std::endl;
}
}
int main() { f(); }
caught error
Triqs runtime error
at /src/triqs/doc/documentation/manual/triqs/utilities/exceptions_1.cpp : 7
The condition is false because 2!=3
Exception was thrown on node
C++ trace =