2017-04-22 8 views
0

Ich möchte die Nachricht einer Ausnahme in ein NSError-Objekt konvertieren, so dass ich es in einem try-catch-Block verwenden kann (ich arbeite tatsächlich an einem native iOS module for React Native).So konvertieren Sie eine Ausnahme in ein NSError-Objekt

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

Ich will die Ausnahme in ein NSError konvertieren, weil der dritte Parameter der reject Funktion (die auf der Seite JS ein Versprechen verwirft) erwartet die Eingabe von NSError Typ zu sein. Ich bin mir nicht sicher, ob meine Lösung (unter Verwendung von try-catch) das Beste, was in diesem Szenario ist ..

In this Apple Developer Guide es sagt

Sie können eine Ausnahme in ein NSError Objekt konvertieren und dann präsentieren die Informationen in dem Fehlerobjekt an den Benutzer in einem Warnfeld.

jedoch die Führung nicht ein Codebeispiel zeigt dafür und nur ein Codebeispiel für einen zweiten Ansatz wird zeigen, Sie können sie auch indirekt in Methoden geben, die einen Fehler Parameter enthalten, die für das, was zu kompliziert scheint, ich will .

Also, wie würde ich eine Ausnahme in einen NSError konvertieren? The API reference of NSError scheint keine geeignete Funktion zu enthalten ..

+0

Wie möchten Sie die Verwendung des 'NSError' machen? Brauchen Sie wirklich einen 'NSError'? – rmaddy

+0

@rmaddy Ich habe mein Code-Snippet bearbeitet, um meinen Anwendungsfall besser widerzuspiegeln und habe erklärt, warum ich 'NSError' verwenden und' NSException' nicht verwenden kann. Oder könnte ich? – Andru

Antwort

2

Sie können nicht konvertieren NSException-NSError weil NSException sie nicht die gleichen Eigenschaften haben. Gibt es einen Grund dafür, NSException zu fangen anstatt einen **NSError Mechanismus zu bauen? Ausnahmen sind normalerweise fatal und nicht wiederherstellbar, während Fehler nicht fatal und wiederherstellbar sind.

Wenn Sie eine NSException zu einem NSError mit der Umwandlung sowieso zu durchlaufen müssen, können Sie es wie dies manuell tun:

@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

Der Grund für das Abfangen von 'NSException' ist das, was geworfen wird. – rmaddy

+1

Sorry, von Swift kommend habe ich vergessen, dass nur 'NSExceptions' in Obj-C gefunden werden können. Ich habe meine Antwort aktualisiert. Es sollte Ihnen die Sachen zur Verfügung stellen, die Sie benötigen, um Ihre Ausnahme in einen Fehler zu konvertieren. – Oskar

Verwandte Themen