我可以限制函数在Swift中抛出的类型吗?

jha*_*ott 13 swift swift3

当在Swift 3中调用一个函数时throws,你必须在捕获所有可能的错误时详尽无遗,这通常意味着你catch {}在最后有一个不必要的额外处理来处理不会发生的错误.

是否有可能这样说throws MyErrorType,当您处理该枚举中的所有案例时,编译器可以知道您确实已经详尽无遗?

apo*_*pse 5

没有简单的方法可以确保类型安全并抛出错误。考虑到这一点,如果编译器允许您指定throws MyErrorType,那么它还必须确保在该函数主体中您未执行try的函数可能会在do / catch块之外抛出其他类型。(虽然有,但是会增加不必要的复杂性)。Swift编译器可能已经很慢,并且在推断类型时陷入循环,在所有抛出函数链中一直推断Throwd类型可能是一场噩梦。

运行中的想法是,对于大多数错误,无论如何都将以一小部分方式处理它们。

话虽如此,您无需添加额外的catch let error as MyErrorType子句,您只需在catch块中使用开关即可,如下所示:

do {
  try something()
} catch let e {
  switch e {
  case let m as MyErrorType: handleMyError(m)
  case let o as OtherErrorType: handleOther(o)
  case is ThirdErrorType: print("error \(e)")
  default: handleElse(e)
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我对这个问题的建议是不要抛出错误,而是Result在函数中返回一个类型。事情会是这样的。

enum MyCustomError: Error {
    case genericError
}

func operationThatFails() -> Result<Response, MyCustomError> {
    guard requiredConsition() else {
        return .failure(.genericError)
    }
    return Response()
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样处理错误:

let result = operationThatFails()
switch result {
case .success(let value):
    // handle success
case .failure(let error):
    // handle error
}

Run Code Online (Sandbox Code Playgroud)

这样你的错误总是类型安全的