是否有可能从Swift代码中捕获Objective-C错误?

时间:2015-11-29 00:01:13

标签: objective-c swift exception

我想做点什么:

try {
    SomeObjectiveClass.someMethod()
catch Error {
    print("Recovered objc crash from Swift!")
}

我正在构建一个应用程序,在其中输入一些视觉约束,我会得到结果或有关任何错误的消息。

现在,每次输入错误的约束时,应用程序都会崩溃,但我想显示一个包含错误的对话框,让用户再试一次。

在我的情况下,我没有“NSError-to-throws”自动翻译。

1 个答案:

答案 0 :(得分:1)

考虑这个课程:

@implementation SomeObjectiveClass

+ (BOOL)someClassMethodWithError:(NSError **)error {
    // some something that 

    if (everythingOk) {
        return true;
    } else {
        if (error) {
            *error = [NSError errorWithDomain:kMyDomain code:kSomeErrorCode userInfo:@{NSLocalizedDescriptionKey : @"Some error message"}];
        }
        return false;
    }
}

- (BOOL)someInstanceMethodWithError:(NSError **)error {
    // some something that 

    if (everythingOk) {
        return true;
    } else {
        if (error) {
            *error = [NSError errorWithDomain:kMyDomain code:kSomeOtherErrorCode userInfo:@{NSLocalizedDescriptionKey : @"Some error message"}];
        }
        return false;
    }
}

@end

然后您可以捕获这些错误:

do {
    try SomeObjectiveClass.someClassMethod()

    // or

    let object = SomeObjectiveClass()
    try object.someInstanceMethod()
} catch {
    print("Recovered \(error) from Swift!")
}

请注意,不应将此错误捕获与我们以前在Objective-C中可以执行的异常处理相混淆。在开发过程中应该消除例外情况。以上是针对合法的运行时错误(例如,由于程序员控制之外的条件而可能发生的网络请求失败或其他错误)。

引用Using Swift with Cocoa and Objective-C

  

尽管Swift错误处理类似于Objective-C中的异常处理,但它完全是独立的功能。如果Objective-C方法在运行时抛出异常,则Swift会触发运行时错误。无法直接在Swift中从Objective-C异常中恢复。必须在Swift使用的Objective-C代码中实现任何异常处理行为。