在Swift中捕获Objective-C异常

问题描述:

我试图使用obj.setValue(value, forKey: key)在我的Swift代码中设置@objc对象的值。在Swift中捕获Objective-C异常

当对象被设置属性时它工作正常。但如果没有,我的应用程序崩溃很难与未被捕获NSException(“类不是关键值编码兼容...”)。

如何捕获和吸收这个异常,就像我可以在Objective-C中一样,以便不会崩溃我的应用程序?我试图用Swift试着抓包,但它抱怨没有任何指令会抛出并且什么都不做。

+0

你真的需要KVC吗?字典中的对象应该设置为'setObject:forKey:'或特别是在Swift中的主要脚注。 – vadian

+0

是的,我正在编写一个XML解析器,需要能够通过对象名称来设置对象的任意属性。 – devios1

+0

然后,如果密钥存在,则不要进行异常检查。 – vadian

看到这个answer

// 
// ExceptionCatcher.h 
// 

#import <Foundation/Foundation.h>  

NS_INLINE NSException * _Nullable tryBlock(void(^_Nonnull tryBlock)(void)) { 
    @try { 
     tryBlock(); 
    } 
    @catch (NSException *exception) { 
     return exception; 
    } 
    return nil; 
} 
+0

这个伎俩!不漂亮,但我很高兴至少有可能! – devios1

+1

这一个更漂亮:http://stackoverflow.com/a/36454808/364446 – KPM

不是我所期待的,很不幸,答案:

虽然斯威夫特的错误处理类似异常处理在Objective-C,它是完全独立的功能。如果Objective-C方法在运行时抛出异常,则Swift会触发运行时错误。无法直接在Swift中从Objective-C异常中恢复。任何异常处理行为都必须在Swift使用的Objective-C代码中实现。 “使用可可和Objective-C的Swift(Swift 2.1)”,iBooks。 https://itun.es/ca/1u3-0.l

我攻击的下一步计划是增加一个Objective-C的功能,我可以叫出来,将包裹在@try/@catch的尝试。这真的很糟糕,苹果。

我想叫出来在这个问题给出了答案:

Catching NSException in Swift

,你仍然可以使用斯威夫特做/捕获与呼叫一个自然的时尚,Swift的下一个最好的事情实际上捕捉ObjC异常,因为它应该。