在Swift中捕获Objective-C异常
问题描述:
我试图使用obj.setValue(value, forKey: key)
在我的Swift代码中设置@objc
对象的值。在Swift中捕获Objective-C异常
当对象被设置属性时它工作正常。但如果没有,我的应用程序崩溃很难与未被捕获NSException
(“类不是关键值编码兼容...”)。
如何捕获和吸收这个异常,就像我可以在Objective-C中一样,以便不会崩溃我的应用程序?我试图用Swift试着抓包,但它抱怨没有任何指令会抛出并且什么都不做。
答
看到这个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;
}
答
不是我所期待的,很不幸,答案:
虽然斯威夫特的错误处理类似异常处理在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
的尝试。这真的很糟糕,苹果。
答
我想叫出来在这个问题给出了答案:
,你仍然可以使用斯威夫特做/捕获与呼叫一个自然的时尚,Swift的下一个最好的事情实际上捕捉ObjC异常,因为它应该。
你真的需要KVC吗?字典中的对象应该设置为'setObject:forKey:'或特别是在Swift中的主要脚注。 – vadian
是的,我正在编写一个XML解析器,需要能够通过对象名称来设置对象的任意属性。 – devios1
然后,如果密钥存在,则不要进行异常检查。 – vadian