> On 27 Dec 2016, at 13:43, Tino Heth <2...@gmx.de> wrote:
> Imho this is no problem:
> Right now, we basically have "throws Error", and no matter what is actually 
> thrown, we can always catch exhaustive by keeping the statement unspecific.

True, but for me it's more about knowing what a method can throw; currently to 
know that you need to consult documentation which, while fine, isn't the best 
way to do that when the compiler could know and it's then up to you whether to 
let it auto-complete for all throwable types, or just be generic for some or 
all of them (or pass the buck).

>> myMethod(args:[String:Any]) throws IOError, IllegalArgumentError? { … }
> Imho to much confusion with no real benefit:
> Shouldn't it be up to the caller to decide which errors need special 
> treatment? The library can't enforce proper handling at all.

Partly, but it's really just intended to distinguish things that are genuine 
runtime errors, versus things that shouldn't have happened, i.e- an illegal 
argument type error shouldn't occur if you're using a method correctly, so it's 
more like something you might check as an assertion. I should have been more 
clear that the main difference is in how fix-its might recommend the errors are 
handled; specific types would produce catch blocks, but optionals might be 
grouped into a catch-all at the end (e.g- they're special interest that you 
might not be bothered about), but the compiler would still be aware of them 
should you decide to add them.

If the distinctions not significant enough though then the "optional" error 
types could just be ignored for now, I think the more important ability is the 
ellipsis indicating "plus other errors" so we can specify either exhaustive 
lists of error types, or keep them open-ended, in which case the types listed 
are those that would be placed as catch blocks, with the ellipsis indicating 
that a catch-all is still required (or throw on the current method).

> One thing to note with explicit errors is that we'd basically introduce sum 
> types…

Not necessarily; you could think of explicit errors as being doing something 
like:

        enum MyErrorType {
                case io_error(IOError)
                case illegal_argument(IllegalArgumentError)
                case unknown(Error)
        }

i.e- boilerplate we could do right now, but would prefer not to, but still 
allowing it to be handled as an enum.
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to