一尘不染

Swift惯用错误检查

swift

假设您有一个像这样的函数:

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在某些情况下可以是真的吗?

谢谢!


阅读 200

收藏
2020-07-07

共1个答案

一尘不染

比较
《错误处理编程指南》中从方法返回的处理错误对象

重要提示:
方法的返回值指示成功或失败。尽管在方法可通过直接返回nil或NO指示失败的情况下,保证在该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)")
}
2020-07-07