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

Howard Lovatt howard.lovatt at gmail.com
Thu Jul 6 09:33:43 CDT 2017


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 at 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 :)
> 
>> On Thu, Jul 6, 2017 at 11:04 AM Howard Lovatt <howard.lovatt at 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 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/20170707/03864301/attachment.html>


More information about the swift-users mailing list