如何在 swift 2.2 中捕获 NSUnknownKeyException?

Posted

技术标签:

【中文标题】如何在 swift 2.2 中捕获 NSUnknownKeyException?【英文标题】:How to catch NSUnknownKeyException in swift 2.2? 【发布时间】:2016-05-28 00:55:35 【问题描述】:

我有一个代码,我想为键设置如下值:

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:

我怎样才能捕捉到这个异常?

任何帮助将不胜感激。

【问题讨论】:

这不是可捕获的错误。这是一个例外!比较这里的讨论***.com/questions/35973899/… @matt 在其他语言中,异常是不是可以捕获的? Objective-C 异常表示编程错误。您不会发现编程错误。你修复它们。 这能回答你的问题吗? Catching NSException in Swift 【参考方案1】:

你不能在 Swift 中做到这一点。

不要混淆错误和异常:

Swift 中错误的想法是提前退出当前范围。

Cocoa 中异常 的意思是你死在水里;你不应该允许这种情况发生。

现在,Cocoa 有时会抛出异常并自行捕获它。但是现在官方不鼓励这种行为,而且这不是你可以在 Swift 中做的事情。如果你要发送这个类是你的,你可以随意实现setValue:forUndefinedKey:,但如果发生未捕获的 NSException,那就是游戏的结束——Swift 无法捕获它。

【讨论】:

如果你不喜欢它的工作方式,并且你不想使用 Objective-C,你可能想向 Apple 提交增强请求——虽然老实说我不知道是否有可能在 Swift 中捕获 Objective-C 异常,即使他们想要允许它。 异常 = 死在水里。必须记住那个:-)【参考方案2】:

您可以使用围绕 Objective-C 的 @try/@catch 的 Swift 包装器捕获异常,例如 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: 

)

【讨论】:

以上是关于如何在 swift 2.2 中捕获 NSUnknownKeyException?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中捕获 NSKeyedUnarchiver“NSInvalidUnarchiveOperationException”?

如何在 Swift 中使用 AVCaptureSession 捕获图片?

如何在 Swift 2.2 中编写这些函数?

c_cpp 如何在Swift中正确捕获NSExceptions?

IOS - 如何在 Swift 3 中从 JSON 中捕获动态数组维度

在 Swift 中捕获 NSException