是否可以从Swift代码中捕获Objective-C错误



我想做一些类似的事情:

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

我正在构建一个应用程序,在那里我键入一些视觉约束,然后我会得到任何错误的结果或消息。

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

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

考虑这个类:

@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中能够进行的异常处理混淆。在开发过程中应消除例外情况。以上是针对合法的运行时错误(例如,失败的网络请求或可能由于程序员无法控制的条件而发生的其他错误)。

引用Swift与Cocoa和Objective-C的结合:

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

最新更新