[swift-users] Is it possible to specify error type thrown in a protocol method

Howard Lovatt howard.lovatt at gmail.com
Wed Jul 5 20:04:14 CDT 2017


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 at 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 at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170706/fd90847c/attachment.html>


More information about the swift-users mailing list