如何将异常转换为NSError对象

And*_*dru 1 exception-handling objective-c react-native-ios

我想将异常消息转换为NSError对象,以便可以在try-catch块中使用它(我实际上是在React Native本机iOS模块上工作)。

RCT_EXPORT_METHOD(myMethod:(NSDictionary *)dict
             resolver:(RCTPromiseResolveBlock)resolve
             rejecter:(RCTPromiseRejectBlock)reject)
{
  @try {
    // Do something which could throw something (NS Error or NS Exception)
    resolve(nil);
  } @catch (NSException *exception) {
    // HERE I WANT TO TRANSFORM THE EXCEPTION exception INTO AN ERROR error
    NSError error = ???
    reject(@"my_error", @"Could not do something important", error);
  }
}
Run Code Online (Sandbox Code Playgroud)

我想将异常转换为,NSError因为reject函数的第三个参数(拒绝JS端的Promise)期望输入的类型为NSError。我不确定我的解决方案(使用try-catch)在这种情况下是否是最好的方法。

此《 Apple开发人员指南》中,它说

您可以将异常转换为NSError对象,然后在警报面板中将错误对象中的信息呈现给用户。

但是,该指南并未显示该示例的代码示例,而仅显示了第二种方法的代码示例。您也可以在包含错误参数的方法中间接返回它们,这些错误参数对于我想要的而言似乎很复杂。

那么,如何将异常转换为NSError?NSError的API参考似乎不包含合适的功能。

Osk*_*kar 5

您不能转换NSException为,NSError因为NSException它们没有相同的属性。有什么理由要抓住NSException而不是建立一种**NSError机制?异常通常是致命的且不可恢复,而错误则是非致命的且可恢复。

如果您仍然需要将转换NSExceptionNSError,可以这样手动进行:

@try {
    // Something
} @catch (NSException *exception) {
    NSMutableDictionary * info = [NSMutableDictionary dictionary];
    [info setValue:exception.name forKey:@"ExceptionName"];
    [info setValue:exception.reason forKey:@"ExceptionReason"];
    [info setValue:exception.callStackReturnAddresses forKey:@"ExceptionCallStackReturnAddresses"];
    [info setValue:exception.callStackSymbols forKey:@"ExceptionCallStackSymbols"];
    [info setValue:exception.userInfo forKey:@"ExceptionUserInfo"];

    NSError *error = [[NSError alloc] initWithDomain:yourdomain code:errorcode userInfo:info];
    //use error
}
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,来自Swift我忘了在Obj-C中只能捕获NSExceptions。我已经更新了答案。它应该为您提供将异常转换为错误所需的内容。 (2认同)
  • @Oskar,您可以同时捕获NSError和NSException。要么有一个`@catch(id e)`子句,要么每个子句都有一个子句(@@ try {...} @catch(NSError err){...} @catch(NSException ex){...}`) (2认同)