首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 2中的试捕用法

Swift 2中的试捕用法
EN

Stack Overflow用户
提问于 2015-06-28 20:31:54
回答 2查看 1.9K关注 0票数 0

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

在操场的右侧,我会看到txt文件的内容。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-28 22:22:10

根据失败的原因,您必须查看error对象并检查它为什么失败。你正在捕捉error,所以看看它:

代码语言:javascript
复制
func read(path: String) throws {
    do {
        try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
    } catch {
        print("cannot read: \(error)")
    }
}

那就告诉你它为什么失败了。

话虽如此,但这并不完全有意义:首先,您正在将路径的内容读取到NSString中,但却放弃了它。您可能希望返回此字符串或使用它执行某些操作。

第二,read被声明为throws错误,但实际上并不是这样。它捕获任何可能发生的错误,但不会抛出任何东西。您必须决定read是否会抛出它生成的任何错误,或者它是否会在不抛出任何错误的情况下处理这些错误,或者两者兼而有之。

假设调用方将处理错误,您可能会完全放弃read中的任何read构造:

代码语言:javascript
复制
func read(path: String) throws -> NSString? {
    return try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
}

然后,您可以让调用方捕获NSString抛出的任何错误。例如,您可能会捕获"not“错误:

代码语言:javascript
复制
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不仅捕获错误,而且确保它也捕获错误,那么您需要从它的catch块显式地throw错误。您可以使用您自己的ErrorType或抛出刚才捕获的原始错误来使用此模式:

代码语言:javascript
复制
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
}

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

票数 4
EN

Stack Overflow用户

发布于 2015-06-28 22:10:30

我也在学习,所以我写了一个小演示。希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31104449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档