xcode - Swift 2 中的 do-try-catch 用法

标签 xcode swift try-catch

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

enter image description here

在 playground 的右边我会看 txt 文件的内容。

最佳答案

就此失败的原因而言,您必须查看 error 对象并检查失败的原因。您发现了错误,所以请看一下:

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

这会告诉您失败的原因。


综上所述,这并没有什么意义:首先,您将路径的内容读入 NSString,但将其丢弃。您可能想返回此字符串或对其进行处理。

其次,read 的声明方式表明它会throws 错误,但事实并非如此。它捕获任何可能发生的错误,但不抛出任何东西。您必须决定 read 是否会抛出它生成的任何错误,或者它是否会在不抛出任何错误的情况下处理这些错误,或者两者兼而有之。

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

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 不仅捕获错误,而且确保它也throw 错误,那么您需要显式地 从它的catch block 中>throw 一个错误。您可以使用您自己的 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
}

坦率地说,我认为上面概述的模式更简单,但鉴于您的代码片段,我想我也会说明后一种模式,以防您需要类似的东西。

关于xcode - Swift 2 中的 do-try-catch 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31104449/

相关文章:

xcode - GDB 备忘单

xcode - 用于存档 iOS 应用程序的位码版本无效

ios - 设置单元格的更好方法

arrays - 最常见的数组元素

ios - 如何设置子 TableView 中选定行的背景颜色?

java - try catch block 不适用于 sql

java - 如何制作一个 try-catch block ,该 block 不断调用对象上的方法,直到没有更多异常可捕获

iphone - 链接具有可达性的 UITableView 单元格

c# - MessageBox展开按钮以获取进一步的错误描述

swift - 在 Swift 中调用具有相同签名的 Obj-C 方法