【发布时间】:2014-09-12 04:44:23
【问题描述】:
注意:我在这篇文章的标题中说 Objective C/Swift 是因为我相信这个问题的答案将适用于这两种语言,但我在这篇文章中包含的代码是 Swift。
Java 有一个很好的异常处理机制,但在 Objective C 中,我们要么从委托方法返回错误,要么通过引用将错误传递给函数,然后再检查它。我想知道,当抛出错误时,从期望返回值(例如 NSString、UIImage 或其他一些复杂对象)的方法返回的最干净的方法是什么?我不知道“抛出”是否是在 Objective C 中使用的正确词,但我的意思是当您进行返回非零 NSError 的调用时。
例如,假设我有这段代码试图创建一个二维码的 UIImage:
func createQRImageWithString(string: String, andWidth width: Int32, andHeight height: Int32) -> UIImage {
var error : NSError?
let writer : ZXMultiFormatWriter = ZXMultiFormatWriter()
let result = writer.encode(string, format: kBarcodeFormatQRCode, width: width, height: height, error: &error)
if (error) {
println(error!.localizedDescription)
} else {
let image :CGImageRef = ZXImage(matrix: result).cgimage
return UIImage(CGImage: image)
}
}
此函数无法编译,因为在 if 语句中没有返回 UIImage 对象。 func 在 func 和使用它的任何人之间创建一个合同,承诺将返回一个 UIImage。如果发生错误,我没有 UIImage 可以返回。我想我可以制作一个虚拟的空 UIImage 并返回它,但这肯定不是预期的。那么处理这个问题的最佳方法是什么?
我给出了一个使用 UIImage 的示例,但我希望答案可以推广到方法承诺返回对象但由于无法预料的错误返回该对象不会按计划进行的任何情况。
【问题讨论】:
-
出于兴趣,你会用 Java 做什么?或者 Swift did 是否有异常处理?
-
在Objective-C中不测试
NSErrorout变量来判断是否发生错误,如果没有错误则不保证为0。而是测试该方法是否有错误,如果有错误,则从 out 错误变量中获取错误详细信息。这适用于调用 Objective-C API 的 Swift。 -
Objective-C 确实有异常,但将它们保留用于编程错误,而不是程序控制。由于 Swift 调用 Objective-C API,因此基本上适用相同的规则。问题是不能保证 Objective-C 异常可以跨堆栈帧处理异常。
-
@Zaph 所说的“测试方法是否有错误”你的意思是不是将“错误”传递给 if 语句,我应该传递方法的返回值(在这种情况下是“结果”)?
-
在 Objective-C 中(参见特定文档),如果出现错误,该方法将返回
nil。这表明发生了错误。然后从out error参数中获取错误信息。 out error 参数不用于指示错误(有少数例外,再次奖励方法上的文档),即使没有错误也可能被方法修改。
标签: ios objective-c error-handling swift