> On Aug 26, 2016, at 8:39 AM, Félix Cloutier via swift-evolution 
> <[email protected]> wrote:
> 
> 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 contract is a lie in almost all real-world programs because real programs 
talk to the network, the filesystem, the database, etc and the class of errors 
that can be thrown is tremendous. The number of functions where “throws Foo” is 
an improvement and Foo is not an exhaustive list of “throws HTTPError, 
NetworkError, StorageError, DatabaseError, MachPortError, …” is close enough to 
zero to be considered zero. This ultimately leads to library authors merely 
wrapping exceptions using generic catch-all blocks anyway, adding no useful 
information.

There is zero value to adding it without the compiler enforcing it because you 
can only omit default catch blocks safely when you can be certain the list of 
exceptions is exhaustive.

I am sympathetic to the default/generic catch block problem but we could 
certainly solve that with some added syntax or automatic insertion of a rethrow 
if an error doesn’t match, meaning any function with a try{} and no default 
catch must itself be a throwing function.



Since this isn’t applicable to Swift 4 phase 1 I’ll hush now :)

Russ

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to