如何在 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 捕获图片?
c_cpp 如何在Swift中正确捕获NSExceptions?