在Swift 2中使用do-try-catch

时间:2015-06-28 20:31:54

标签: xcode swift try-catch

这种用法不正确吗?为什么?我使用的文件名是正确的!

enter image description here

在操场右侧的

我会看到txt文件的内容。

2 个答案:

答案 0 :(得分:4)

就失败原因而言,您必须查看error对象并检查失败的原因。你抓住了error,所以看看它:

func read(path: String) throws {
    do {
        try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
    } catch {
        print("cannot read: \(error)")
    }
}

这会告诉你它失败的原因。

说完所有这些之后,这没有多大意义:首先,你正在阅读NSString路径的内容,但丢弃它。你可能想要返回这个字符串或用它做一些事情。

其次,read已经被声明为throws错误,但事实并非如此。它捕获可能发生的任何错误,但不会抛出任何错误。你必须决定read是否会抛出它产生的任何错误,或者它是否会处理它们而不会抛出任何错误,或两者兼而有之。

假设调用者要处理错误,您可能只是放弃do中的任何try - catch - read构造:

func read(path: String) throws -> NSString? {
    return try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
}

然后你可以让调用者捕获NSString抛出的任何错误。例如,您可能会收到“未找到”错误:

do {
    let string = try read(path)
    // do something with string
} catch let error as NSError where error.domain == NSCocoaErrorDomain && error.code == NSCocoaError.FileReadNoSuchFileError.rawValue {
    // not found handling here
} catch {
    print(error)
}

如果您真的希望read不仅能够捕获错误,而且还要确保throws一个错误,那么您需要明确throw错误来自catch它的ErrorType块。您可以使用自己的func read(path: String) throws -> NSString? { var string: NSString? do { string = try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) } catch { // do whatever special handling you want here // but also throw error so caller is informed that there was an issue throw error } return string } 使用此模式,也可以只丢弃刚刚捕获的原始错误:

print

坦率地说,我认为上面提到的模式更简单,但考虑到你的代码片段,我想我也会说明后一种模式,以防你需要类似的东西。

答案 1 :(得分:0)

我也在学习,所以我写了一个小小的演示。希望能帮助到你。 enter image description here