As long as the language offers an easy, automatic way to erase the error, I really don't see the problem here. As a framework author I'd rather offer precise errors the user can erase with a standard mechanism than erased errors the user has to recover by knowing about my error types.
IMO, it's simple enough to have throws
and throws ErrorType
, where any throw of a typed error from within a throws
function will automatically be erased to Error
.