Swift惯用错误检查

时间:2015-04-01 06:29:14

标签: swift error-handling idioms nserror

假设您有这样的功能:

func getSomething(error: NSErrorPointer) -> Something

并且您通常以这种方式使用它:

var error : NSError? = nil
let a = getSomething(&error)

在这里检查错误的惯用方法是什么?更具体的问题:

  1. 如果error == nil我们可以假设a永远不会是零和副 反之亦然?
  2. 我们应该先检查一下:error(因为它的无效)或a(来自 确认它不是零)?
  3. 在某些情况下a != nil && error != nil可以为真吗?
  4. 谢谢!

2 个答案:

答案 0 :(得分:8)

比较Handling Error Objects Returned From Methods 在"错误处理编程指南":

  

重要提示:成功或失败由返回值表示   方法。虽然Cocoa方法间接返回错误对象   如果是,Cocoa错误域保证返回这样的对象   方法通过直接返回nil或NO来表示失败,你应该   在尝试之前,始终检查返回值是否为“否”   使用NSError对象执行任何操作。

因此对于Cocoa / Cocoa Touch方法,您应该始终检查返回值 价值第一。如果方法失败,保证error != nil, 但如果方法成功,则没有明确保证error == nil

示例:

JSON序列化

var error : NSError?
if let jsonObj = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) {
    // success
} else {
    // failure
    println("Invalid JSON data: \(error!.localizedDescription)")
}

核心数据提取请求

var error : NSError?
if let result = context.executeFetchRequest(request, error: &error) {
    // success, result has zero or more elements
} else {
    // failure
    println("Fetch failed: \(error!.localizedDescription)")
}

复制文件

var error : NSError?
if !NSFileManager.defaultManager().copyItemAtPath(srcPath, toPath: dstPath, error: &error) {
    println("Cannot copy file: \(error!.localizedDescription)")
}

当然,您可以为自己的功能定义自己的规则, 但我会遵循相同的Apple指南。


更新:从Swift 2开始,产生错误的Cocoa方法是 转换为抛出错误的Swift函数,以及此错误 必须使用try - catch处理。这是Swift 2版本 以上例子:

JSON序列化

do {
    let jsonObj = try NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
    // success
} catch let error as NSError {
    // failure
    print("Invalid JSON data: \(error.localizedDescription)")
}

核心数据提取请求

do {
    let result = try context.executeFetchRequest(request)
    // success, result has zero or more elements
} catch let error as NSError {
    // failure
    print("Fetch failed: \(error.localizedDescription)")
}

复制文件

do {
    try NSFileManager.defaultManager().copyItemAtPath(srcPath, toPath: dstPath)
} catch let error as NSError {
    print("Cannot copy file: \(error.localizedDescription)")
} 

答案 1 :(得分:0)

如果函数返回一个可选值,即

func someFunc(someVar: String) -> NSData? {
  // some code
}

(可选意味着它可以返回零) 然后错误检查非常简单

if let data = someFunc("someString") {
  // this means there was NO error as the function didn't return a nil
}
else {
  // This means there was an error
}

此视频非常适合在swift https://youtu.be/m8szaLqHVDs

中进行错误检查和处理