如何在Swift 2.2中捕获NSUnknownKeyException?

3

我有一段代码,我想要按以下方式设置键的值:

item.setValue(field.1, forKey: field.0)

我希望能够捕获NSUnknownKeyException异常,但是我有以下代码却不起作用:

 do {
     try item.setValue(field.1, forKey: field.0)
 } catch _ {
     print("Trying to set wrong value for the item ")
 }

当键值无效时,显示的错误信息如下:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: setValue:forUndefinedKey:

我应该如何捕获这个异常?任何帮助将不胜感激。

1
它不是可捕获的错误。它是一个异常!请参考这里的讨论:https://dev59.com/MVsV5IYBdhLWcg3wpQN8 - matt
@matt 在其他编程语言中,异常不也是可以被捕获的吗? - Miguelme
Objective-C异常表示编程错误。你不应该捕获编程错误,而是修复它们。 - gnasher729
这个回答解决了你的问题吗?在Swift中捕获NSException - Sindre Sorhus
2个回答

4

你不能在Swift中这样做。

不要混淆错误和异常:

  • 在Swift中,错误的概念是为了尽早退出当前范围。

  • 在Cocoa中,异常的概念是你无法进行下去了;你永远不应该让这种情况发生。

现在,有时候Cocoa会抛出异常并自己捕获它。但是这种行为现在已经被官方不推荐使用,并且在Swift中也无法实现。如果你发送的类是你自己的,你可以按照自己的想法实现setValue:forUndefinedKey:方法,但如果出现未捕获的NSException,游戏就结束了——而Swift无法捕获它。


如果您不喜欢这样的工作方式,也不想使用Objective-C,那么您可能希望向苹果提出增强请求 - 虽然说实话,即使他们想允许,我也不知道在Swift中捕获Objective-C异常是否可能。 - matt
异常 = 停滞不前。必须记住这个 :-) - gnasher729

0

您可以使用Swift封装Objective-C的@try/@catch来捕获异常,例如https://github.com/williamFalcon/SwiftTryCatch

您的情况下使用方法如下:

SwiftTryCatch.try({ 
    item.setValue(field.1, forKey: field.0)

}, catch: { (exception) in
    print("Trying to set wrong value for the item ")

}, finally: {

})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接