2017-04-22 22 views
0

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

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侧)的第三个参数期望的输入是NSError类型。我不知道我的解决方案(使用的try-catch)是否在这种情况下的最好的事情..

this Apple Developer Guide它说

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

然而,指南不显示该代码示例,只显示了第二种方法一个代码示例,您也可以间接地包含一个错误参数这似乎复杂了,我想要什么方法将返回他们。

那么,我将如何将异常转换为NSError? The API reference of NSError似乎并不包含合适的功能。

+0

你怎么想利用'NSError'的?你真的需要一个'NSError'吗? – rmaddy

+0

@rmaddy我编辑了我的代码片断以更好地反映我的用例,并解释了为什么我想使用'NSError'并且不能使用'NSException'。或者我能吗? – Andru

回答

2

您不能将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 
} 
+0

捕捉'NSException'的原因就是被抛出。 – rmaddy

+1

对不起,来自Swift我忘记只有'NSExceptions'可以在Obj-C中被捕获。我已经更新了我的答案。它应该为您提供将异常转换为错误所需的东西。 – Oskar