2010-07-16 21 views
0

Je crée une application basée sur l'iPhone et j'ai des problèmes d'interception. Jusqu'à présent, je ne l'ai jamais eu de problème avec les prises d'essai, mais ici ... bien: DProblème d'interception d'exceptions

Voici le code qui ne se coince pas exception:

- (void)updateView:(NSTimer*)t { 

    NSMutableDictionary *requestResult = [[[NSMutableDictionary alloc] init] autorelease]; 

    @try { 
     requestResult = [self.eqParam getParameters]; 
    } 
    @catch (MMConnectionFailed * e) { 
     [self performSelectorOnMainThread:@selector(noConnection) withObject:@"Could not reach server." waitUntilDone:YES]; 
    } 
} 

Les méthodes latérales inférieures jettent bien des exceptions en mode débogage en cas d'exception mais lorsque cette méthode est concernée, rien n'est intercepté.

Une idée?


MISE À JOUR:

Enfin, j'ai découvert où était le problème, mais je ne sais toujours pas pourquoi l'exception n'a pas été jeté sur le levier inférieur. J'ai changé la fin de ma méthode getParameters. Ici:

- (NSMutableDictionary *)getParameters { 

    @try { 
     // be careful with NSMutableDictionary. Has to be used with setters to be correctly affected 
     lastResponse = [MMSoapMethods getEquipmentParametersWithUserString:user equipmentId:equipmentId]; 
    } 
    @catch (MMConnectionFailed * e) { 
     @throw e; 
    } 
    @finally { 
     if (self.lastResponse) { 
      return lastResponse; 
     }  
     else 
      return nil; 
    } 
} 

Je viens enlevé les @finally balises qui l'entourent et l'exception a été levée. Étrange, n'est-ce pas?

+0

Vous pouvez également placer l'étiquette Objective-C dans la question. Il est probable que vous attrapiez le mauvais type d'exception ou qu'aucune exception ne soit générée par le code dans la section try. – Nubsis

Répondre

1

Je pense que @finally l'emporte sur tout le reste. Fondamentalement, ne jamais retourner une valeur d'un bloc @finally.

Refactor votre code pour GetParameters comme ceci:

- (NSMutableDictionary *)parameters // Objective-C naming convention - no get 
{ 

     // be careful with NSMutableDictionary. Has to be used with setters to be correctly affected 
     // your version did not retain the return result. This does, as long as the property lastResponse is retain 
     self.lastResponse = [MMSoapMethods getEquipmentParametersWithUserString:user equipmentId:equipmentId]; 
     return self.lastResponse; 

     // no need to catch an exception just so you can throw it again 
} 

Je pense que ce qui précède est équivalent à ce que vous aviez, sauf qu'il ne returna valeur du bloc finally et lastReponse ne disparaîtra pas sous vous (En supposant que vous utilisez le comptage de ref plutôt que GC).

+0

Ouais tu as raison, mon code était un peu bête ... Merci beaucoup pour ta réponse, c'est parfait! –