2017-04-22 51 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