<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">This proposal should be reviewed as a part of “typed throws” proposal, with the <a href="https://github.com/apple/swift-evolution/pull/68">original PR</a> prepared by David Owens.</p>
<p style="margin:0px 0px 1.2em!important">Typed throws won’t change anything about how many types can be thrown. Only one type/protocol will be specified in the function type. You will still be able to specify <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">throws Error</code> by default, but in the cases, where API authors put some effort in their error handling, these APIs will be self-documented and undoubtably easier to work with. In many cases, one can at least specify some existential error type, which will be domain-specific, and still better than what we have now.</p>
<p style="margin:0px 0px 1.2em!important">I feel like Swift, together with Rust, can change current overall mess in error handling across many programming languages by providing not only syntax, but also semantics and guidelines. Swift errors, unlike exceptions, require dealing with them immediately. If one cannot deal with the error, but error details can be useful on hier levels of abstraction (for actually solving the problem, not logging), he still should put some work into wrapping the error, leaving only important details and preparing them for most conventient access.</p>
<p style="margin:0px 0px 1.2em!important">On syntax, I feel like this is the obvious one:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important">func convert(_: String) -&gt; Int throws IntegerConversionError
</code></pre><p style="margin:0px 0px 1.2em!important">Basically, we say that the function can either return an <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Int</code>, or throw an <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">IntegerConversionError</code>. (Side note: yes, not <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">NumericConversionError</code>, if we want the API to both provide most detailed information when we need it, and express the range of possible errors for a particular function through the type system. However, one can also create hierarchies of error protocols to aid in abstraction—both abstraction and preciseness are important.)</p>
<p style="margin:0px 0px 1.2em!important">But can we make a step even further? One can say that the function returns “either Int or an error”. Rust users blame Swift for creating syntax sugar for everything—maybe we can live without it this time? Look at it this way: we already have a deep support for <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Optional&lt;T&gt;</code> in the language. It’s so seamless, many people don’t even <em>realize</em> they work with <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Optional&lt;T&gt;</code>. Can we make working with a standard enum <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Result&lt;T, E&gt;</code> this simple?</p>
<p style="margin:0px 0px 1.2em!important">We can even leave current syntax in place, just <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">T throws E</code> will be a sugar for <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Result&lt;T, E&gt;</code>. Methods of error handling described in <a href="https://github.com/apple/swift/blob/master/docs/ErrorHandling.rst">this manifesto</a> will be represented, respectively, by <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Optional</code>, <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">Result</code>, and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">fatalError</code>, with all of them defined in the standard library—isn’t that reasonable?</p>
<div title="MDH:VGhpcyBwcm9wb3NhbCBzaG91bGQgYmUgcmV2aWV3ZWQgYXMgYSBwYXJ0IG9mICJ0eXBlZCB0aHJv
d3MiIHByb3Bvc2FsLCB3aXRoIHRoZSBbb3JpZ2luYWwgUFJdKGh0dHBzOi8vZ2l0aHViLmNvbS9h
cHBsZS9zd2lmdC1ldm9sdXRpb24vcHVsbC82OCkgcHJlcGFyZWQgYnkgRGF2aWQgT3dlbnMuPGRp
dj48YnI+PC9kaXY+PGRpdj5UeXBlZCB0aHJvd3Mgd29uJ3QgY2hhbmdlIGFueXRoaW5nIGFib3V0
IGhvdyBtYW55IHR5cGVzIGNhbiBiZSB0aHJvd24uIE9ubHkgb25lIHR5cGUvcHJvdG9jb2wgd2ls
bCBiZSBzcGVjaWZpZWQgaW4gdGhlIGZ1bmN0aW9uIHR5cGUuIFlvdSB3aWxsIHN0aWxsIGJlIGFi
bGUgdG8gc3BlY2lmeSBgdGhyb3dzIEVycm9yYCBieSBkZWZhdWx0LCBidXQgaW4gdGhlIGNhc2Vz
LCB3aGVyZSBBUEkgYXV0aG9ycyBwdXQgc29tZSBlZmZvcnQgaW4gdGhlaXIgZXJyb3IgaGFuZGxp
bmcsIHRoZXNlIEFQSXMgd2lsbCBiZSBzZWxmLWRvY3VtZW50ZWQgYW5kIHVuZG91YnRhYmx5IGVh
c2llciB0byB3b3JrIHdpdGguIEluIG1hbnkgY2FzZXMsIG9uZSBjYW4gYXQgbGVhc3Qgc3BlY2lm
eSBzb21lIGV4aXN0ZW50aWFsIGVycm9yIHR5cGUsIHdoaWNoIHdpbGwgYmUgZG9tYWluLXNwZWNp
ZmljLCBhbmQgc3RpbGwgYmV0dGVyIHRoYW4gd2hhdCB3ZSBoYXZlIG5vdy48L2Rpdj48ZGl2Pjxi
cj48L2Rpdj48ZGl2PkkgZmVlbCBsaWtlIFN3aWZ0LCB0b2dldGhlciB3aXRoIFJ1c3QsIGNhbiBj
aGFuZ2UgY3VycmVudCBvdmVyYWxsIG1lc3MgaW4gZXJyb3IgaGFuZGxpbmcgYWNyb3NzIG1hbnkg
cHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGJ5IHByb3ZpZGluZyBub3Qgb25seSBzeW50YXgsIGJ1dCBh
bHNvIHNlbWFudGljcyBhbmQgZ3VpZGVsaW5lcy4gU3dpZnQgZXJyb3JzLCB1bmxpa2UgZXhjZXB0
aW9ucywgcmVxdWlyZSBkZWFsaW5nIHdpdGggdGhlbSBpbW1lZGlhdGVseS4gSWYgb25lIGNhbm5v
dCBkZWFsIHdpdGggdGhlIGVycm9yLCBidXQgZXJyb3IgZGV0YWlscyBjYW4gYmUgdXNlZnVsIG9u
IGhpZXIgbGV2ZWxzIG9mIGFic3RyYWN0aW9uIChmb3IgYWN0dWFsbHkgc29sdmluZyB0aGUgcHJv
YmxlbSwgbm90IGxvZ2dpbmcpLCBoZSBzdGlsbCBzaG91bGQgcHV0IHNvbWUgd29yayBpbnRvIHdy
YXBwaW5nIHRoZSBlcnJvciwgbGVhdmluZyBvbmx5IGltcG9ydGFudCBkZXRhaWxzIGFuZCBwcmVw
YXJpbmcgdGhlbSBmb3IgbW9zdCBjb252ZW50aWVudCBhY2Nlc3MuPC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj5PbiBzeW50YXgsIEkgZmVlbCBsaWtlIHRoaXMgaXMgdGhlIG9idmlvdXMgb25lOjwv
ZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj5mdW5jIGNvbnZlcnQoXzogU3Ry
aW5nKSAtJmd0OyBJbnQgdGhyb3dzIEludGVnZXJDb252ZXJzaW9uRXJyb3I8L2Rpdj48ZGl2PmBg
YDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+QmFzaWNhbGx5LCB3ZSBzYXkgdGhhdCB0aGUgZnVu
Y3Rpb24gY2FuIGVpdGhlciByZXR1cm4gYW4gYEludGAsIG9yIHRocm93IGFuIGBJbnRlZ2VyQ29u
dmVyc2lvbkVycm9yYC4gKFNpZGUgbm90ZTogeWVzLCBub3QgYE51bWVyaWNDb252ZXJzaW9uRXJy
b3JgLCBpZiB3ZSB3YW50IHRoZSBBUEkgdG8gYm90aCBwcm92aWRlIG1vc3QgZGV0YWlsZWQgaW5m
b3JtYXRpb24gd2hlbiB3ZSBuZWVkIGl0LCBhbmQgZXhwcmVzcyB0aGUgcmFuZ2Ugb2YgcG9zc2li
bGUgZXJyb3JzIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gdGhyb3VnaCB0aGUgdHlwZSBzeXN0
ZW0uIEhvd2V2ZXIsIG9uZSBjYW4gYWxzbyBjcmVhdGUgaGllcmFyY2hpZXMgb2YgZXJyb3IgcHJv
dG9jb2xzIHRvIGFpZCBpbiBhYnN0cmFjdGlvbi0tYm90aCBhYnN0cmFjdGlvbiBhbmQgcHJlY2lz
ZW5lc3MgYXJlIGltcG9ydGFudC4pPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5CdXQgY2FuIHdl
IG1ha2UgYSBzdGVwIGV2ZW4gZnVydGhlcj8gT25lIGNhbiBzYXkgdGhhdCB0aGUgZnVuY3Rpb24g
cmV0dXJucyAiZWl0aGVyIEludCBvciBhbiBlcnJvciIuIFJ1c3QgdXNlcnMgYmxhbWUgU3dpZnQg
Zm9yIGNyZWF0aW5nIHN5bnRheCBzdWdhciBmb3IgZXZlcnl0aGluZy0tbWF5YmUgd2UgY2FuIGxp
dmUgd2l0aG91dCBpdCB0aGlzIHRpbWU/IExvb2sgYXQgaXQgdGhpcyB3YXk6IHdlIGFscmVhZHkg
aGF2ZSBhIGRlZXAgc3VwcG9ydCBmb3IgYE9wdGlvbmFsJmx0O1QmZ3Q7YCBpbiB0aGUgbGFuZ3Vh
Z2UuIEl0J3Mgc28gc2VhbWxlc3MsIG1hbnkgcGVvcGxlIGRvbid0IGV2ZW4gKnJlYWxpemUqIHRo
ZXkgd29yayB3aXRoIGBPcHRpb25hbCZsdDtUJmd0O2AuIENhbiB3ZSBtYWtlIHdvcmtpbmcgd2l0
aCBhIHN0YW5kYXJkIGVudW0gYFJlc3VsdCZsdDtULCBFJmd0O2AgdGhpcyBzaW1wbGU/PC9kaXY+
PGRpdj48YnI+PC9kaXY+PGRpdj5XZSBjYW4gZXZlbiBsZWF2ZSBjdXJyZW50IHN5bnRheCBpbiBw
bGFjZSwganVzdCBgVCB0aHJvd3MgRWAgd2lsbCBiZSBhIHN1Z2FyIGZvciBgUmVzdWx0Jmx0O1Qs
IEUmZ3Q7YC4gTWV0aG9kcyBvZiBlcnJvciBoYW5kbGluZyBkZXNjcmliZWQgaW4gW3RoaXMgbWFu
aWZlc3RvXShodHRwczovL2dpdGh1Yi5jb20vYXBwbGUvc3dpZnQvYmxvYi9tYXN0ZXIvZG9jcy9F
cnJvckhhbmRsaW5nLnJzdCkgd2lsbCBiZSByZXByZXNlbnRlZCwgcmVzcGVjdGl2ZWx5LCBieSBg
T3B0aW9uYWxgLCBgUmVzdWx0YCwgYW5kIGBmYXRhbEVycm9yYCwgd2l0aCBhbGwgb2YgdGhlbSBk
ZWZpbmVkIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LS1pc24ndCB0aGF0IHJlYXNvbmFibGU/PGJy
PjwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>