2011-06-18 9 views
5

Używam menedżera obiektów programu Restkit do obsługi dobrych uchwytów moich zdalnych wywołań interfejsu API.Obsługa serwerów NSA w usłudze Restkit:

Wyrzuca NSAssert za szeroki zakres błędów. Na przykład, jeśli serwer zwróci stronę błędu, w przeciwieństwie do dobrze sformułowanego json, podniesie ona NSAssert, nawet jeśli nie ma w tym nic złego.

Istnieje kilka rzeczy, jestem zagubiony (z których większość ma do czynienia z ogólną obsługę wyjątków i nsasserts)

  1. Jak powinniśmy traktować te NSAsserts błędy? Na przykład, chcielibyśmy spróbować ponownie kilka razy, a następnie pokazać komunikat "coś poszło nie tak". (w przeciwieństwie do awarii aplikacji)

  2. Próbowałem użyć bloku catch-try, aby złapać błędy (kod poniżej), ale błędy nie zostały przechwycone. Moja aplikacja po prostu zawiedzie. Ponadto, nie jestem wygodne przy użyciu try-catch w trybie zwolnienia mimo to.

  3. Tylko dla mojego zrozumienia, dlaczego Restkit użytku NSAsserts, w przeciwieństwie do innych awarii

Bardzo dziękuję za pomoc - mile widziane!

// code to catch NSAssert that sharedManager throws 
@try{ 
    [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self]; 
} 

@catch (NSException *ex) { 
    NSLog(@"exception caught"); 
} 
+0

IME, ludzie (w tym ja) używają twierdzeń, ponieważ jest to łatwe, nie dlatego, że jest to dobra obsługa błędów. Kod produkcyjny nie powinien mieć asercji, które zawodzą, ponieważ serwer zwrócił śmieci; kod biblioteki * naprawdę * nie powinien. Możesz wypróbować '#define NS_BLOCK_ASSERTIONS 1' i zobaczyć, co się stanie ... –

Odpowiedz

3

Generalnie należy NIE spróbować złapać NSAssert błędów, a to znaczy, że coś poszło bardzo źle - na przykład stan wewnętrzny aplikacji staje się niespójny, biblioteka jest niepoprawnie używana itp. - i dlatego aplikacja musi zakończyć działanie. [1]

Powodem twoje błędy nie są przyłapania dlatego NSAssert podnosi NSInternalInconsistencyException [2], która jest ciąg a nie instancją NSException. Nadal można je złapać zgodnie z [3], np. z

@catch (id ex) 

ale nie jest to zalecane z powodów wymienionych powyżej.

Aby odpowiedzieć na pytanie 3. Proszę podać więcej szczegółów, wokół którego NSAssert jest podniesiona itp

[1] What's the point of NSAssert, actually?

[2] http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/macro/NSAssert

[3] http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html