It would be a breaking change since it modifies the behavior of `throws` 
without a type parameter. It would also be incompatible with the declaration of 
methods in protocols.

Félix

> Le 28 août 2016 à 01:44:27, Bouke Haarsma via swift-evolution 
> <swift-evolution@swift.org> a écrit :
> 
> On 2016-08-26 15:39:05 +0000, Félix Cloutier via swift-evolution said:
> 
> Hi all,
> 
> Currently, a function that throws is assumed to throw anything. There was a 
> proposal draft last December to restrict that. The general idea was that 
> you'd write, for instance:
> 
> 
> enum Foo: ErrorProtocol {
>     case bar
>     case baz
> }
> 
> func frob() throws Foo {
>     throw Foo.bar // throw .bar?
> }
> 
> If you `catch Foo` (or every case of Foo), now that the compiler can verify 
> that your catch is exhaustive, you no longer have to have a catch-all block 
> at the end of the sequence.
> 
> This impacts the metadata format and has implications on resilience, which 
> leads me to believe that the discussion could qualify for the phase 1 of 
> Swift 4. If this is the case, I'd be interested in pulling out the old 
> discussions and seeing where we left that at.
> Félix 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> 
> Hi,
> 
> Shouldn't the compiler be able to infer the types thrown, and thus whether 
> all types have been thrown? The general idea being that the following would 
> be valid:
> 
> enum Foo: Error {
>     case bar
>     case baz
> }
> 
> func hello() throws { // inferred to throw only "Foo.bar"
>     throw Foo.bar
> }
> 
> func world() throws { // inferred to throw only "Foo.baz"
>     throw Foo.baz
> }
> 
> func galaxy() throws { // inferred to throw only "Foo.baz"
>     do {
>         try hello()
>     } catch Foo.bar {
>         // ...
>     }
>     // catch is exhaustive, no catch-all clause needed
> 
>     try world()
> }
> 
> func universe() { // all errors are handled, no 'throws' declaration needed
>     do {
>         try galaxy()
>     } catch Foo.baz {
>         // ..
>     }
>     // catch is exhaustive, no catch-all clause needed
> }
> 
> Now for clarity one could add the type information as per your proposal, but 
> wouldn't be necessary as the compiler would infer it itself.
> 
> Either way a +1 from me, as the current model forces one to catch-all errors, 
> even the ones you did not expect to be thrown. Thus potentially hiding 
> programming errors.
> 
> - Bouke
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to