2011-06-18 1 views
5

J'utilise le gestionnaire d'objets de Restkit pour gérer un bon mandrin de mes appels d'API distants.Gestion de NSAsserts dans Restkit throws

Il lance NSAssert pour un large éventail d'erreurs. Par exemple, si le serveur renvoie une page d'erreur par opposition à json bien formé, il déclenchera un NSAssert, même s'il n'y a rien de mal avec le code.

Il y a quelques choses que je suis confus au sujet (dont la plupart ont à voir avec la gestion générale des exceptions et nsasserts)

  1. Comment devrions-nous gérer ces erreurs NSAsserts? Par exemple, nous voudrions réessayer à quelques reprises, puis montrer un message «quelque chose s'est mal passé». (par opposition à l'écrasement de l'application)

  2. J'ai essayé d'utiliser un bloc catch-try pour intercepter les erreurs (code ci-dessous), mais les erreurs ne sont pas détectées. Donc, mon application ne cesse d'échouer. De plus, je ne suis pas à l'aise avec l'utilisation de try-catch en mode release de toute façon.

  3. Pour ma compréhension, pourquoi NSAsserts d'utilisation Restkit, par opposition à une autre défaillance

Merci beaucoup pour votre aide - beaucoup apprécié!

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

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

IME, les gens (y compris moi-même) utilisent les affirmations parce que c'est facile, pas parce que c'est une bonne gestion des erreurs. Le code de production ne doit pas avoir d'assertions qui échouent parce qu'un serveur a renvoyé des ordures; code de la bibliothèque * vraiment * ne devrait pas. Vous pouvez essayer '#define NS_BLOCK_ASSERTIONS 1' et voir ce qui se passe ... –

Répondre

3

En général, vous devriez pas essayer d'attraper NSAssert erreurs, car ils signifient que quelque chose a terriblement mal - par exemple un état interne d'application devient incohérent, vous utilisez incorrectement la bibliothèque, etc., et l'application doit donc quitter. [1]

La raison pour laquelle vos erreurs ne sont pas pris est parce que NSAssert soulève une NSInternalInconsistencyException [2], qui est une chaîne et non une instance de NSException. Vous pouvez toujours les attraper selon [3], par ex. avec

@catch (id ex) 

mais ce n'est pas recommandé pour les raisons énumérées ci-dessus.

Pour répondre à votre question 3, s'il vous plaît fournir plus de détails autour de laquelle NSAssert est plaidée, etc.

[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