在Swift中捕获Objective-C异常

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)


Vla*_*lad 9

带有实用程序错误类型的 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)


dev*_*os1 8

不幸的是,不是我希望的答案:

虽然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.