<div dir="ltr">Fernando, the rationale behind the design of error handling in Swift is detailed here:<div><a href="https://github.com/apple/swift/blob/master/docs/ErrorHandlingRationale.rst">https://github.com/apple/swift/blob/master/docs/ErrorHandlingRationale.rst</a></div><div>Some of that document may now be out-of-date, but you may find it to be helpful nonetheless.<div><br><div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Aug 6, 2016 at 10:40 AM, Anton Zhilin via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><span class=""><p style="margin:0px 0px 1.2em!important">2016-08-06 2:50 GMT+03:00 Fernando Rodríguez &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:</p>
<p style="margin:0px 0px 1.2em!important"></p><div><p></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>b) do/try/catch</div><div><br></div><div>This allows you to have information about the error, but also causes the newly created object to be &quot;trapped&quot; inside a do block.</div><div><br></div><div>Are there any plans to address this situation? I believe there should be a single, obvious and convenient way of handling errors in the language.</div></div></blockquote><p></p></div><p style="margin:0px 0px 1.2em!important"></p>
</span><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);border-radius:3px;display:inline;background-color:rgb(248,248,248);white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span><span style="color:rgb(51,51,51);font-weight:bold">func</span> <span style="color:rgb(153,0,0);font-weight:bold">attempt</span><span>&lt;T&gt;</span><span>(<span style="color:rgb(0,128,128)">_</span> expression: @autoclosure <span>()</span> throws -&gt; T, handler: <span>(ErrorProtocol)</span> -&gt; T)</span> -&gt; <span style="color:rgb(153,0,0);font-weight:bold">T</span> </span>{
    <span style="color:rgb(51,51,51);font-weight:bold">do</span> {
        <span style="color:rgb(51,51,51);font-weight:bold">return</span> try expression()
    } catch {
        <span style="color:rgb(51,51,51);font-weight:bold">return</span> handler(error)
    }
}

<span style="color:rgb(51,51,51);font-weight:bold">let</span> x = attempt(downloadDataOrThrow()) {
    <span style="color:rgb(0,134,179)">print</span>(<span style="color:rgb(221,17,68)">&quot;Connection lost&quot;</span>)
    <span style="color:rgb(51,51,51);font-weight:bold">return</span> <span style="color:rgb(0,134,179)">nil</span>
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">It mimics <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);border-radius:3px;display:inline;background-color:rgb(248,248,248)">guard</code> statement. You can also have versions of <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);border-radius:3px;display:inline;background-color:rgb(248,248,248)">attempt</code> with partially defined handlers, like “return <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);border-radius:3px;display:inline;background-color:rgb(248,248,248)">nil</code>“ or “<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);border-radius:3px;display:inline;background-color:rgb(248,248,248)">print</code> and crash”, or “assert type of error”.</p>
<div title="MDH:PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj4yMDE2LTA4
LTA2IDI6NTAgR01UKzAzOjAwIEZlcm5hbmRvIFJvZHLDrWd1ZXogPHNwYW4gZGlyPSJsdHIiPiZs
dDs8YSBocmVmPSJtYWlsdG86c3dpZnQtZXZvbHV0aW9uQHN3aWZ0Lm9yZyIgdGFyZ2V0PSJfYmxh
bmsiPnN3aWZ0LWV2b2x1dGlvbkBzd2lmdC5vcmc8L2E+Jmd0Ozwvc3Bhbj46PGJsb2NrcXVvdGUg
Y2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6
MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+PGRpdiBkaXI9Imx0ciI+PGRpdj5iKSBk
by90cnkvY2F0Y2g8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoaXMgYWxsb3dzIHlvdSB0byBo
YXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciwgYnV0IGFsc28gY2F1c2VzIHRoZSBuZXds
eSBjcmVhdGVkIG9iamVjdCB0byBiZSAidHJhcHBlZCIgaW5zaWRlIGEgZG8gYmxvY2suPC9kaXY+
PGRpdj48YnI+PC9kaXY+PGRpdj5BcmUgdGhlcmUgYW55IHBsYW5zIHRvIGFkZHJlc3MgdGhpcyBz
aXR1YXRpb24/IEkgYmVsaWV2ZSB0aGVyZSBzaG91bGQgYmUgYSBzaW5nbGUsIG9idmlvdXMgYW5k
IGNvbnZlbmllbnQgd2F5IG9mIGhhbmRsaW5nIGVycm9ycyBpbiB0aGUgbGFuZ3VhZ2UuPC9kaXY+
PC9kaXY+PC9ibG9ja3F1b3RlPjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBgc3dpZnQ8L2Rpdj48ZGl2
PmZ1bmMgYXR0ZW1wdCZsdDtUJmd0OyhfIGV4cHJlc3Npb246IEBhdXRvY2xvc3VyZSAoKSB0aHJv
d3MgLSZndDsgVCwgaGFuZGxlcjogKEVycm9yUHJvdG9jb2wpIC0mZ3Q7IFQpIC0mZ3Q7IFQgezwv
ZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBkbyB7PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNw
OyAmbmJzcDsgcmV0dXJuIHRyeSBleHByZXNzaW9uKCk8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsg
fSBjYXRjaCB7PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgcmV0dXJuIGhh
bmRsZXIoZXJyb3IpPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IH08L2Rpdj48ZGl2Pn08L2Rpdj48
ZGl2Pjxicj48L2Rpdj48ZGl2PmxldCB4ID0gYXR0ZW1wdChkb3dubG9hZERhdGFPclRocm93KCkp
IHs8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgcHJpbnQoIkNvbm5lY3Rpb24gbG9zdCIpPC9kaXY+
PGRpdj4mbmJzcDsgJm5ic3A7IHJldHVybiBuaWw8L2Rpdj48ZGl2Pn08L2Rpdj48ZGl2PmBgYDwv
ZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SXQgbWltaWNzIGBndWFyZGAgc3RhdGVtZW50LiBZb3Ug
Y2FuIGFsc28gaGF2ZSB2ZXJzaW9ucyBvZiBgYXR0ZW1wdGAgd2l0aCBwYXJ0aWFsbHkgZGVmaW5l
ZCBoYW5kbGVycywgbGlrZSAicmV0dXJuIGBuaWxgIiBvciAiYHByaW50YCBhbmQgY3Jhc2giLCBv
ciAiYXNzZXJ0IHR5cGUgb2YgZXJyb3IiLjwvZGl2PjwvZGl2PjwvZGl2Pg==" style="min-height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>
<br>______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br></div></div>