This is a case of bad goto use.
Really - understand that there is "no good goto use" in C++ (see below).
As long as you don't jump outside of trys, or inside loops, that's fine.
I.e. it is mostly used to jump out of nested loops.
And yes, there are plenty of situations were nested loops make sense. And doing that with an exception is violating the KISS principle.
By placing a goto *anywhere* in code you have placed the coding equivalent of a *landmine*.
Why? Because if anyone in the future working on a large loop with a goto hiding in it uses some normally perfectly acceptable OO or exception handling code then
*boom* you end up with
undefined behavior even though you didn't even *write* the stupid goto.
So if you think it is a good idea to hide gotos in large loops then I'd suggest you might want to put a comment on every 3rd line or so like this:
// Warning, warning! Danger Will Robertson! This loop contains a *goto* landmine. You are best to only write C code in here.
In no C++ project that I have worked on was *goto* ever used (or would have been accepted) and even in a very large C project I worked on it was used very sparingly.
The only people I've found to still write "goto" are C programmers who never managed to accept the idea of exception handling.
BTW - for your nested loop situation use this approach:
bool done = false;
bool some_cond = false;
for( size_t i = 0; i < 10 && !done; i++ )
{
for( size_t j = 0; j < 10 && !done; j++ )
{
for( size_t k = 0; k < 10 && !done; k++ )
{
if( some_cond )
{
done = true;
break;
}
}
}
}