Looks a bit strange to me.. Maybe a more generic approach, where the catch clause is inspired by the for statement:
catch ([declaration] [; test]) { ... }
Then I can write dynamic stuff like
try { ... } catch (object err; err->is_my_error && err->failure_pos > 4711) { ... }
while all you inspired-by-statically-typed-languages folks can write
try { ... } catch (MyError err) { ... }
But it all hinges on that runtime type matching works well and is reasonably efficient (at least for objects).