在Swift中捕获Objective-C异常

19

我正在尝试在Swift代码中使用obj.setValue(value, forKey: key)来设置一个带有@objc标记的对象的值。

当对象具有要设置的属性时,它可以正常工作。但是如果没有这样的属性,我的应用程序会因为未捕获的NSException("class is not key value coding-compliant…")而崩溃。

我该如何像在Objective-C中那样捕获和吸收此异常,以避免使我的应用程序崩溃?我尝试将其包装在Swift try-catch语句中,但它抱怨没有一条指令会抛出异常,因此什么也不做。


你真的需要KVC吗?在字典中设置对象应该使用setObject:forKey:或键下标,特别是在Swift中。 - vadian
是的,我正在编写一个XML解析器,并且需要能够通过名称在对象上设置任意属性。 - devios1
那么,与其捕获异常,不如检查键是否存在。 - vadian
那绝对可行。我以前还觉得没有办法做到呢! - devios1
2
可能是Catching NSException in Swift的重复问题。 - kelin
4个回答

24

请查看此答案

//
//  ExceptionCatcher.h
//

#import <Foundation/Foundation.h>    

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

成功了!虽然不太美观,但至少我很高兴它是可能的! - devios1

15

使用实用错误类型的Swift 5版本:

NS_INLINE NSException * _Nullable ExecuteWithObjCExceptionHandling(void(NS_NOESCAPE^_Nonnull tryBlock)(void)) {
    @try {
        tryBlock();
    }
    @catch (NSException *exception) {
        return exception;
    }
    return nil;
}
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)
      }
   }
}


13

很遗憾,这不是我所希望的答案:

尽管Swift错误处理与Objective-C中的异常处理类似,但它是完全独立的功能。如果在运行时发生Objective-C方法引发的异常,Swift将触发运行时错误。在Swift中没有直接恢复Objective-C异常的方法。任何异常处理行为都必须在被Swift使用的Objective-C代码中实现。

摘自:Apple Inc. “Using Swift with Cocoa and Objective-C (Swift 2.1).” iBooks. https://itun.es/ca/1u3-0.l

我的下一步计划是添加一个我可以调用的Objective-C函数,该函数将用@try/@catch来封装尝试过程。这真的很糟糕,苹果。


1
我希望你能翻译这个问题中给出的答案:

在Swift中捕获NSException

正如你仍然可以自然地使用Swift do/catch来调用它,这是Swift实际上应该捕获ObjC异常的下一个最好的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接