Is it possible to specify error type thrown in a protocol method


(Tim Wang) #1

Hi Swifters,

I am wondering if it is possible to specify error types thrown in a
protocol method. By allowing us to do it and letting the compiler check all
the implementations of the protocol to make sure only they would only throw
the specified error types, we only need to catch our error types when
calling these methods.

For the code below:

enum MyError: Error {

    case justError

}

protocol MethodWillThrow {

    func testMethod() throws MyError

}

extension MethodThrow {

    func testMethod() throws {

        throw MyError.justError

    }

}

class TestClass: MethodThrow {

    func testMethod() throws {

        throw MyError.justError

    }

    func anotherMethod() {

        do {

            try testMethod()

        } catch MyError.justError {

            print("my error")

        } *catch {*

* print("other error")*

* }*

    }

}

Now we need add this extra default catch to make it compile and work and I
really want to remove this catch.

Please let me know if there is a way to do it and thanks for help in
advance.

Tim Wang


Why doesn't Swift have explicit throwables like Java
(Howard Lovatt) #2

You could use a result type, e.g.:

https://github.com/antitypical/Result

Or roll your own result type.

I think the reason that Swift doesn't support what you want is because of
rethrows. When you declare a method as rethrows it can throw anything
because the closure it is re-throwing can throw anything. They could have
fully typed the rethrows but obviously decided that was not worth it. At
present rethrows is light weight; the compiler generates two versions of
the method, one that throws and one that doesn't. If it was typed then it
would be like a generic method and a version of the method would be
required for each type combination that was actually used.

  -- Howard.

···

On 6 July 2017 at 10:38, Tim Wang via swift-users <swift-users@swift.org> wrote:

Hi Swifters,

I am wondering if it is possible to specify error types thrown in a
protocol method. By allowing us to do it and letting the compiler check all
the implementations of the protocol to make sure only they would only throw
the specified error types, we only need to catch our error types when
calling these methods.

For the code below:

enum MyError: Error {

    case justError

}

protocol MethodWillThrow {

    func testMethod() throws MyError

}

extension MethodThrow {

    func testMethod() throws {

        throw MyError.justError

    }

}

class TestClass: MethodThrow {

    func testMethod() throws {

        throw MyError.justError

    }

    func anotherMethod() {

        do {

            try testMethod()

        } catch MyError.justError {

            print("my error")

        } *catch {*

* print("other error")*

* }*

    }

}

Now we need add this extra default catch to make it compile and work and I
really want to remove this catch.

Please let me know if there is a way to do it and thanks for help in
advance.

Tim Wang

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


(Tim Wang) #3

Thanks Howard, it's a good workaround.

Do you think it would be better to be part of swift language feature? I
wish swift team could consider this :slight_smile:

···

On Thu, Jul 6, 2017 at 11:04 AM Howard Lovatt <howard.lovatt@gmail.com> wrote:

You could use a result type, e.g.:

https://github.com/antitypical/Result

Or roll your own result type.

I think the reason that Swift doesn't support what you want is because of
rethrows. When you declare a method as rethrows it can throw anything
because the closure it is re-throwing can throw anything. They could have
fully typed the rethrows but obviously decided that was not worth it. At
present rethrows is light weight; the compiler generates two versions of
the method, one that throws and one that doesn't. If it was typed then it
would be like a generic method and a version of the method would be
required for each type combination that was actually used.

  -- Howard.

On 6 July 2017 at 10:38, Tim Wang via swift-users <swift-users@swift.org> > wrote:

Hi Swifters,

I am wondering if it is possible to specify error types thrown in a
protocol method. By allowing us to do it and letting the compiler check all
the implementations of the protocol to make sure only they would only throw
the specified error types, we only need to catch our error types when
calling these methods.

For the code below:

enum MyError: Error {

    case justError

}

protocol MethodWillThrow {

    func testMethod() throws MyError

}

extension MethodThrow {

    func testMethod() throws {

        throw MyError.justError

    }

}

class TestClass: MethodThrow {

    func testMethod() throws {

        throw MyError.justError

    }

    func anotherMethod() {

        do {

            try testMethod()

        } catch MyError.justError {

            print("my error")

        } *catch {*

* print("other error")*

* }*

    }

}

Now we need add this extra default catch to make it compile and work and
I really want to remove this catch.

Please let me know if there is a way to do it and thanks for help in
advance.

Tim Wang

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


(Howard Lovatt) #4

On balance I think I prefer result types. Java's fully typed throws and Swift's semi-typed throws are fine though. I can't see Swift supporting result types because they already have throws.

-- Howard.

···

On 6 Jul 2017, at 4:27 pm, Tim Wang <shenghai.wang@bigtincan.com> wrote:

Thanks Howard, it's a good workaround.

Do you think it would be better to be part of swift language feature? I wish swift team could consider this :slight_smile:

On Thu, Jul 6, 2017 at 11:04 AM Howard Lovatt <howard.lovatt@gmail.com> wrote:
You could use a result type, e.g.:

https://github.com/antitypical/Result

Or roll your own result type.

I think the reason that Swift doesn't support what you want is because of rethrows. When you declare a method as rethrows it can throw anything because the closure it is re-throwing can throw anything. They could have fully typed the rethrows but obviously decided that was not worth it. At present rethrows is light weight; the compiler generates two versions of the method, one that throws and one that doesn't. If it was typed then it would be like a generic method and a version of the method would be required for each type combination that was actually used.

  -- Howard.

On 6 July 2017 at 10:38, Tim Wang via swift-users <swift-users@swift.org> wrote:

Hi Swifters,

I am wondering if it is possible to specify error types thrown in a protocol method. By allowing us to do it and letting the compiler check all the implementations of the protocol to make sure only they would only throw the specified error types, we only need to catch our error types when calling these methods.

For the code below:

enum MyError: Error {

    case justError

}

protocol MethodWillThrow {

    func testMethod() throws MyError

}

extension MethodThrow {

    func testMethod() throws {

        throw MyError.justError

    }

}

class TestClass: MethodThrow {

    func testMethod() throws {

        throw MyError.justError

    }

    func anotherMethod() {

        do {

            try testMethod()

        } catch MyError.justError {

            print("my error")

        } catch {

            print("other error")

        }

    }

}

Now we need add this extra default catch to make it compile and work and I really want to remove this catch.

Please let me know if there is a way to do it and thanks for help in advance.

Tim Wang

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users