[swift-evolution] Throws? and throws!

Karl Wagner razielim at gmail.com
Fri Jan 13 09:44:04 CST 2017

I can see the appeal, but really throwable errors are just one kind of error that can happen in code.

Preconditions are a different thing. They represent axioms that must be kept for a sane program. It’s up to the programmer to decide whether something should be treated as an axiom or something recoverable. For a few particular operations (Array indexing, arithmetic), the standard library designers have decided that out-of-bounds values are to be considered axiom violations.

If that’s not convenient for your application, you could suggest changing the standard library to include throwing or optional-wrapped alternatives. You could also write your own:

extension Array {
    subscript(unchecked index: Index) -> Iterator.Element? {       // Subscripts aren’t allowed to throw. There’s another proposal on that.
        guard (startIndex..<endIndex).contains(index) else { return .none }
        return self[index]

let array = [1,2,3,4]
array[unchecked: 99] // Returns nil
array[unchecked: 0]  // Returns 1

> On 12 Jan 2017, at 23:58, Jonathan Hull via swift-evolution <swift-evolution at swift.org> wrote:
> I really like swift’s error handling system overall. It strikes a good balance between safety and usability.
> There are some cases where it would be nice to throw errors, but errors are rarely expected in most use cases, so the overhead of ‘try’, etc… would make things unusable. Thus fatalError or optionals are used instead.  For example, operators like ‘+’ could never throw because adding ’try’ everywhere would make arithmetic unbearable. But in a few cases it would make my algorithm much cleaner if I just assume it will work and then catch overflow/underflow errors if they happen, and resolve each of them with special cases.  Or perhaps I am dealing with user entered values, and want to stop the calculation and display a user visible error (e.g. a symbol in a spreadsheet cell) instead of crashing.
> I would like to propose adding ‘throws?’ and ‘throws!’ variants to ‘throws’.
> These would be used for cases where error handling is not the default desired behavior, but having it as an option is desired occasionally.  Essentially, the user would no longer have to preface the call with ‘try’, as the compiler would implicitly add ‘try?’ or ‘try!’ respectively.
> Thus, the function would act like a non-throwing function (either trapping or returning an optional in the case of error), but the user could add ‘try’ to the call to override that behavior and deal with the error more explicitly.
> Another example would be bounds checking on arrays.  If subscripting arrays was marked as ‘throws!’ then it would have the same default behavior it does now (trapping on bounds error).  But a user could add ‘try?’ to return nil for a bounds error in cases where they explicitly want that, or they could add ‘try’ to deal with it as an error using do-catch.
> I think this would really increase the availability of error handling in areas where it is impractical right now…
> Thanks,
> Jon
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170113/34e0ce5d/attachment.html>

More information about the swift-evolution mailing list