There has been a discussion earlier about this, of course. Don't feel like digging it up, but I believe my suggestion was something like:
try (mixed err) { // ... } catch (err->is_my_funky_error) { // ... } catch (err->is_foo_error && (err->failure_pos >= 4711 || has_value (err->message, "blah blah"))) { // ... } finally { // ... }
This follows the "looks-like" paradigm and provides adequate dynamic classification power.
Maybe the type system could be used to match the thrown error with the type of the error variable, so you could write e.g.
try (MyFunkyError err) { // ... } catch (1) { // ... }
and still catch only exceptions that are typewise compatible with MyFunkyError. The rest would be rethrown automatically. That way one wouldn't have to bother with old-style error arrays in most cases.