我正在编写一个调用可以抛出错误的方法的结构,但是我不想在这里处理错误,因为我现在无法做任何事情,我想把它泡到像我这样的调用者可以在java / c#中做。
E.g编写一个嵌套结构的Json解析器:
struct InnerParser {
let dateFormatter: NSDateFormatter
init( dateFormatter: NSDateFormatter) {
self.dateFormatter = dateFormatter
}
func parse(json: JSON) throws -> Inner {
let id = json["id"].string
guard let actId = id, else {
throw ParserError.UnexepectedResponse(json)
}
return Inner(id: actId)
}
}
这很好,但问题在于:
struct MiddleParser {
let innerParser: InnerParser
init(innerParser: InnerParser) {
self.innerParser = innerParser
}
func parse(json: JSON) throws -> Middle {
let id = json["id"].string
var inners = [Inner]()
for (_, innerJson) in json["Inner"] {
do {
inners.append(try self.innerParser.parse(innerJson))
} catch (let error) {
throw error
}
}
guard let actId = id, where inners.count > 0 else {
throw ParserError.UnexepectedResponse(json)
}
return Middle(id: actId,inners:inners)
}
}
我必须做一个'抓住重新抛出'这看起来很笨重,有没有办法只是尝试而不是进入一个捕获它逃脱当前函数并在被调用者上引发错误?
答案 0 :(得分:1)
如上所述:https://stackoverflow.com/a/33350601/1370336,在您的“MiddleParser”结构中,您不必将调用包装在do
- catch
块中(因为您的函数已标记为throws
),只需使用:
inners.append(try self.innerParser.parse(innerJson))