dev*_*os1 9 exception-handling nsexception swift swift2
我试图@objc使用我的Swift代码设置对象的值obj.setValue(value, forKey: key).
当对象具有设置的属性时,它工作正常.但如果没有,我的应用程序会因未被捕获而崩溃NSException("类不符合关键值编码......").
如何在Objective-C中捕获并吸收此异常,以免崩溃我的应用程序?我尝试将它包装在一个Swift try-catch中,但它抱怨没有任何指令抛出并且什么都不做.
Cas*_*sey 12
看到这个答案:
//
// ExceptionCatcher.h
//
#import <Foundation/Foundation.h>
NS_INLINE NSException * _Nullable tryBlock(void(^_Nonnull tryBlock)(void)) {
@try {
tryBlock();
}
@catch (NSException *exception) {
return exception;
}
return nil;
}
Run Code Online (Sandbox Code Playgroud)
带有实用程序错误类型的 Swift 5 版本:
NS_INLINE NSException * _Nullable ExecuteWithObjCExceptionHandling(void(NS_NOESCAPE^_Nonnull tryBlock)(void)) {
@try {
tryBlock();
}
@catch (NSException *exception) {
return exception;
}
return nil;
}
Run Code Online (Sandbox Code Playgroud)
public struct NSExceptionError: Swift.Error {
public let exception: NSException
public init(exception: NSException) {
self.exception = exception
}
}
public struct ObjC {
public static func perform(workItem: () -> Void) throws {
let exception = ExecuteWithObjCExceptionHandling {
workItem()
}
if let exception = exception {
throw NSExceptionError(exception: exception)
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,不是我希望的答案:
虽然Swift错误处理类似于Objective-C中的异常处理,但它是完全独立的功能.如果Objective-C方法在运行时抛出异常,则Swift会触发运行时错误.无法直接在Swift中从Objective-C异常中恢复.必须在Swift使用的Objective-C代码中实现任何异常处理行为.
摘录自:Apple Inc."将Swift与Cocoa和Objective-C一起使用(Swift 2.1)."iBooks.https://itun.es/ca/1u3-0.l
我的下一个攻击计划是添加一个我可以调用的Objective-C函数,它将把尝试包装在@try/中@catch.这非常糟糕,Apple.
| 归档时间: |
|
| 查看次数: |
7381 次 |
| 最近记录: |