2017-04-22 1 views
0

Je souhaite convertir le message d'une exception en objet NSError afin de pouvoir l'utiliser dans un bloc try-catch (je travaille actuellement sur un native iOS module for React Native).Comment convertir une exception en objet 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); 
    } 
} 

Je veux convertir l'exception dans un NSError parce que le troisième paramètre de la fonction reject (qui rejette une promesse sur le côté JS) attend l'entrée étant de type NSError. Je ne suis pas sûr que ma solution (à l'aide try-catch) est la meilleure chose dans ce scénario ..

En this Apple Developer Guide il dit

Vous pouvez convertir une exception en un objet NSError puis présenter le informations dans l'objet d'erreur à l'utilisateur dans un panneau d'alerte.

Cependant, le guide ne montre pas un exemple de code pour cela et ne montre qu'un exemple de code pour une deuxième approche Vous pouvez également les renvoyer indirectement dans les méthodes qui incluent un paramètre d'erreur qui semble compliqué pour ce que je veux . Alors, comment convertir une exception en une erreur NSError? The API reference of NSError ne semble pas contenir une fonction appropriée ..

+0

Comment souhaitez-vous utiliser la 'NSError'? Avez-vous vraiment besoin d'un 'NSError'? – rmaddy

+0

@rmaddy J'ai édité mon extrait de code pour mieux refléter mon cas d'utilisation et expliqué pourquoi je veux utiliser 'NSError' et ne peux pas utiliser' NSException'. Ou pourrais-je? – Andru

Répondre

2

Vous ne pouvez pas convertir NSException-NSError parce NSException ils n'ont pas les mêmes propriétés. Y at-il une raison pour attraper NSException au lieu de construire un mécanisme **NSError? Les exceptions sont généralement fatales et non récupérables, tandis que les erreurs sont non fatales et récupérables.

Si vous avez besoin de passer par la conversion d'un NSException à un NSError de toute façon, vous pouvez le faire manuellement comme ceci:

@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

La raison pour attraper 'NSException' est que c'est ce qui est projeté. – rmaddy

+1

Désolé, venant de Swift J'ai oublié que 'NSExceptions' peut être attrapé dans Obj-C. J'ai mis à jour ma réponse. Il devrait vous fournir les éléments dont vous avez besoin pour convertir votre exception en erreur. – Oskar