【发布时间】:2018-03-11 12:51:25
【问题描述】:
简单的问题,之前的主题中尚未回答 - 请在将其标记为重复之前仔细阅读这些主题的答案,问题可能重复但答案尚不令人满意 - 如何识别方法抛出错误以便在 catch 子句中指定?
例如,请看下面的代码。它可以工作,但我更喜欢在同一个嵌套级别有一个单一的 do - 和多个 catch,而不是嵌套的 do(s)。
为了实现这一点,我需要知道抛出了哪个 ErrorType String.init(contentsOf:encoding:) 和 String.write(to:atomically:encoding:) ,显然无法从文档中弄清楚这一点,也不是来自源代码。
我错过了什么吗?
do {
var contents = try String(contentsOf: indexFileUrl, encoding: .utf8)
let jsonText = String(describing: SmartGamesManager.shared.jsonText)
contents = contents.replacingOccurrences(of: text, with: jsonText)
// write to file
do {
try contents.write(to: indexFileUrl, atomically: false, encoding: .utf8)
}
catch {
print("could not write file index.html")
}
}
catch {
print("could not retrieve content of index.html")
}
【问题讨论】:
-
您只能捕获某些错误类型,如果多个方法可以抛出相同的错误,您无法确定您的几个可抛出函数中的哪一个抛出了错误。一种可行的解决方案是重新抛出自定义错误,但即便如此,您也需要嵌套的 do-catch 块。
-
使用可选的try怎么样?即:
if let blah = try? Something() {}pastebin.com/KRi6eA2k -
不幸的是,如果不拔掉头发,您将无能为力。 Dávid 提供的解决方案是我个人使用的解决方案;我创建了我自己的
enum类型,它符合Error和CustomStringConvertible,它“转发”底层Errors。 -
谢谢你们,但我发现这无法像在 Java 异常中那样处理……不在这里寻找解决方法。
-
你可以做
var contents: String; do { contents = try String(contentsOf: indexFileUrl, encoding: .utf8) } catch { print("could not retrieve content of index.html"); return } let jsonText = ...。尽管如此,我还是不太明白您通过分离catch块来实现什么。
标签: ios swift error-handling