A concern I have is that the thrown type of the function is required to conform to Error
. I think there are two potential problems with that.
First, doing so unnecessarily requires any thrown type to conform to Sendable
. This makes sense with Error
because any Error
is a "currency type", and conforming it to Sendable
aids interoperability with concurrency. But with typed throws, this becomes unnecessary, since the compiler can always statically determine if a given error type is Sendable
or not.
Second, we can expect some users to make "helper enums" with something like this:
enum MyError {
case someSpecializedError
case decoding(DecodingError)
}
In cases like these, it's almost always wrong to promote MyError
to any Error
, because code that would normally handle a DecodingError
would fail to do so. Additionally, we might not want users to throw the .someSpecializedError
case outside of some specific domain. Making MyError
not conform to Error
would prevent that.