请考虑以下代码:
enum MyErrorType:ErrorType {
case BadTimes
}
var mightHaveAValue: String?
do {
if let value = mightHaveAValue {
// do stuff with value
} else {
throw MyErrorType.BadTimes
}
// do stuff with NSFileManager using mightHaveAValue which might throw
} catch {
// handle error
}
...我有一个大的do / try / catch块。在这种情况下,错误处理将是相同的,无论mightHaveAValue
是空还是稍后NSFileManager
发生了不良事件。因此,重用错误处理代码是有意义的。
这是Swift2中最干净的方法,还是有一些方法可以自动抛出/捕获一个没有值的可选项?
答案 0 :(得分:6)
看起来没问题,但使用guard let
代替if let
会更好,因为它允许您使用主do
块中的展开值,而不必在{{1}内工作1}}分支。您还可以使用多个if let
分支来处理不同的错误类型。
catch
没有自动处理展开选项的方法,您必须使用众多已知方法之一:do {
guard let value = mightHaveAValue else {
throw MyErrorType.BadTimes
}
// do stuff with value
} catch let error as MyErrorType {
// handle custom error
} catch let error as NSError {
// handle generic NSError
}
,if let
,无合并等。
答案 1 :(得分:0)
也许只是使用像这样的扩展名>
extension Optional {
func throwing() throws -> Wrapped {
if let wrapped = self {
return wrapped
} else {
throw NSError("Trying to access non existing value")
}
}
}