Swift 惯用错误检查

Swift idiomatic error checking

假设您有这样的函数:

func getSomething(error: NSErrorPointer) -> Something

你通常这样使用它:

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

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

  1. 如果 error == nil 我们可以假设 a 永远不会为零,反之亦然 反过来?
  2. 我们应该首先检查什么:error(是否为零)或a(为了 确认它不是 nil)?
  3. 在某些情况下 a != nil && error != nil 可以吗?

谢谢!

比较Handling Error Objects Returned From Methods 在 "Error Handling Programming Guide":

Important: Success or failure is indicated by the return value of the method. Although Cocoa methods that indirectly return error objects in the Cocoa error domain are guaranteed to return such objects if the method indicates failure by directly returning nil or NO, you should always check that the return value is nil or NO before attempting to do anything with the NSError object.

因此对于 Cocoa/Cocoa 触摸方法,您应该始终检查 return 价值第一。如果该方法失败,则保证 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)")
} 

如果一个函数 return 是一个可选值,即

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

(可选的意思是可以return一个nil) 那么错误检查就很简单了

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

中错误检查和处理的一个很好的参考