Well, it doesn't have to be efficient. If there is no error, the code doesn't have to run, and most of the time there shouldn't be any error. (Right?)
A combination could work too, so you can put the declaration at "try" once and for all if you're in that mood,
try { ... } catch (object err; err->is_my_error && err->failure_pos > 4711) { ... }
<=>
try (object err) { ... } catch (; err->is_my_error && err->failure_pos > 4711) { ... }
and
try (object err) { ... } catch (MyError err) { ... } catch (; err->is_my_error && err->failure_pos > 4711) { ... }
(I'm more of the catch MyError type though, given that the typesystem works.)
If the typesystem can't support this, however, the branch of discussion goes to the bitbucket. :)