Swift 2 中的 do-try-catch 用法
do-try-catch usage in Swift 2
这个用法不对吗?为什么?我使用的文件名是正确的!
在游乐场的右边我会纵横看txt文件的内容
我也在学习,所以写了一个小demo。希望能帮助到你。
关于失败的原因,您必须查看 error
对象并检查它失败的原因。您正在捕捉 error
,所以看看它:
func read(path: String) throws {
do {
try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
} catch {
print("cannot read: \(error)")
}
}
这会告诉你失败的原因。
说了这么多,这不太合理:首先,您将路径的内容读入 NSString
,但将其丢弃。您可能想要 return 这个字符串或者用它做一些事情。
其次,read
的声明方式表明它 throws
错误,但事实并非如此。它捕获任何可能发生的错误,但不抛出任何东西。您必须决定 read
是否会抛出它生成的任何错误,或者它是否会在不抛出任何错误的情况下处理这些错误,或者两者兼而有之。
假设调用者将要处理错误,您可以完全放弃 do
-try
-catch
中的任何构造 read
:
func read(path: String) throws -> NSString? {
return try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
}
然后您可以让调用者捕获 NSString
抛出的任何错误。例如,您可能会捕获 "not found" 错误:
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
}
坦率地说,我认为上面概述的模式更简单,但鉴于您的代码片段,我想我也会说明后一种模式,以防您需要类似的东西。
这个用法不对吗?为什么?我使用的文件名是正确的!
在游乐场的右边我会纵横看txt文件的内容
我也在学习,所以写了一个小demo。希望能帮助到你。
关于失败的原因,您必须查看 error
对象并检查它失败的原因。您正在捕捉 error
,所以看看它:
func read(path: String) throws {
do {
try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
} catch {
print("cannot read: \(error)")
}
}
这会告诉你失败的原因。
说了这么多,这不太合理:首先,您将路径的内容读入 NSString
,但将其丢弃。您可能想要 return 这个字符串或者用它做一些事情。
其次,read
的声明方式表明它 throws
错误,但事实并非如此。它捕获任何可能发生的错误,但不抛出任何东西。您必须决定 read
是否会抛出它生成的任何错误,或者它是否会在不抛出任何错误的情况下处理这些错误,或者两者兼而有之。
假设调用者将要处理错误,您可以完全放弃 do
-try
-catch
中的任何构造 read
:
func read(path: String) throws -> NSString? {
return try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
}
然后您可以让调用者捕获 NSString
抛出的任何错误。例如,您可能会捕获 "not found" 错误:
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
}
坦率地说,我认为上面概述的模式更简单,但鉴于您的代码片段,我想我也会说明后一种模式,以防您需要类似的东西。