如何将异常转换为NSError对象

时间:2017-04-22 16:16:19

标签: objective-c exception-handling react-native-ios

我想将异常消息转换为NSError对象,以便我可以在try-catch块中使用它(我实际上正在处理native iOS module for React Native)。

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);
  }
}

我想将异常转换为NSError,因为reject函数的第三个参数(拒绝JS方面的Promise)期望输入为NSError类型。我不确定我的解决方案(使用try-catch)是否是这个场景中最好的东西..

this Apple Developer Guide中说

  

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

但是指南没有显示代码示例,只显示第二种方法的代码示例您也可以在包含错误参数的方法中间接返回它们,这似乎很复杂我想要。

那么,我如何将异常转换为NSError? The API reference of NSError似乎没有合适的功能..

2 个答案:

答案 0 :(得分:4)

您无法将NSException转换为NSError,因为NSException它们没有相同的属性。有没有理由抓住NSException而不是建立**NSError机制?例外通常是致命的,不可恢复的,而错误是非致命的,可以恢复。

如果您需要将NSException转换为NSError,则可以手动执行此操作:

@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
}

答案 1 :(得分:0)

NSError是一个非常灵活的类,它允许一个非常可扩展的错误报告系统,因此没有人禁止您这样做:

/// NSExcetion * e = ...;
[NSError errorWithDomain:e.name code:0 userInfo:@{
    NSUnderlyingErrorKey: e,
    NSDebugDescriptionErrorKey: e.userInfo ?: @{ },
    NSLocalizedFailureReasonErrorKey: (e.reason ?: @"???") }];
}

头文件说明NSUnderlyingErrorKey

  

此键的值应为NSError。

但是应该不是必须,并且盲目依赖字典中发现的东西具有特定类的代码从一开始就被破坏了。这也只是标题。该密钥的官方开发人员文档中没有这样的内容,并且此文档具有权威性。

对于那些迷惑e.userInfo ?: @{ }e.reason ?: @"???"含义的人来说,这只是一种较短的书写方式:

e.reason != nil ? e.reason : @"???"

最后,代码可以识别某些错误并以特定方式处理它们,但是必须编写所有代码以接受任何错误,即使是未知错误也要针对这种情况提供某种默认处理。如果是您的代码,则知道错误域可能是异常名称,因此您可以进行检查,第三方代码会将其视为未知错误。