This is what I’m trying to do (this is a simplification of a real project):
int param;
int result;
void isolated(int p) {
param = p;
try {
// make calculations with "param" and place the
// result into "result"
process();
} catch (...) {
throw "problems..";
}
}
I can’t change the way process() works, since this function is not created in the project and is a third-party function. It works with global variables param and result and we can’t change this.
The problem appears when isolated() is called back from process() with another parameter. I want to catch this situation, but don’t know how to do it, since finally is absent in C++. I feel that I should use RAII technique, but can’t figure out how to do it in this case properly.
This is how I can make it with code duplication:
int param;
int result;
void isolated(int p) {
static bool running;
if (running) {
throw "you can't call isolated() from itself!";
}
running = true;
param = p;
try {
// make calculations with "param" and place the
// result into "result"
process();
running = false;
} catch (...) {
running = false; // duplication!
throw "problems..";
}
}
I still don’t quite sure how
finallyis related here, but you could try Boost.ScopeExit if you want to avoid creating a scope guard structure yourself.Example:
Result: